前提・実現したいこと
今自分はコーヒーの感想を投稿するアプリを作っていて、産地、コク、酸味加工方式など、をactive hashというgemを用いての投稿をしています。
ransack というgemを使って検索機能を実装しています。
カテゴリー検索をしたいのですが、active hashで作ったカテゴリを検索できるのでしょうか?
region_id,body_id とかにカテゴリーのidを保存してる感じです
該当のソースコード
region.rb
ruby
1class Region < ActiveHash::Base 2 self.data = [ 3 { id: 1, name: '--' }, 4 { id: 2, name: 'マルチリージョン' }, 5 { id: 3, name: 'ラテンアメリカ' }, 6 { id: 4, name: 'アフリカ' }, 7 { id: 5, name: 'アジア、太平洋' } 8 ] 9end
drink.rb
ruby
1class Drink < ApplicationRecord 2 extend ActiveHash::Associations::ActiveRecordExtensions 3 belongs_to :user 4 has_one :trade 5 has_many :drink_tag_relations 6 has_many :tags,through: :drink_tag_relations 7 has_one_attached :image 8 belongs_to_active_hash :region 9 belongs_to_active_hash :body 10 belongs_to_active_hash :acidity 11 belongs_to_active_hash :processing 12 with_options presence: true do 13 validates :name 14 validates :explain 15 end 16end 17
こんな感じで、drink.rbとregion.rbのアソシエーションを組んでて、drinksテーブルに
カテゴリーのidを保存してる感じです
drinks_controller
ruby
1class DrinksController < ApplicationController 2 include SessionsHelper 3 before_action :searched_drink_object,only:[:index,:search_drink] 4 before_action :logged_in_user, only: [:index,:destroy] 5 def index 6 @user = current_user 7 @drinks = Drink.all.order("created_at DESC") 8 set_drink_column 9 end 10 11 def show 12 @drink = Drink.find(params[:id]) 13 @user = @drink.user 14 end 15 16 def new 17 @drink = DrinkTag.new 18 end 19 20 def create 21 @drink = DrinkTag.new(drink_params) 22 if @drink.valid? 23 @drink.save 24 redirect_to drinks_path 25 else 26 render 'new' 27 end 28 end 29 30 def destroy 31 Drink.find(params[:id]).destroy 32 redirect_to root_path 33 end 34 35 # GET search 36 def search 37 return nil if params[:keyword] == "" 38 # 何も入れず検索したらエラーが起こるので、 39 # 明示的にnilを返す 40 tag = Tag.where(['tag_name LIKE ?',"%#{params[:keyword]}%"]) 41 # 第二引数が第一引数の?に入っていく,検索した 42 # タグがデータベースにあれば返す 43 render json:{ keyword: tag} 44 # const tagName = XHR.response.keyword 45 # の.keywordが使えてる 46 47 end 48 49 # GET drinks/search_drinks 50 def search_drink 51 @results = @p.result.includes(:body,:acidity) 52 #binding.pry 53 # 作った検索オブジェクト@pに対して.result 54 # とすると検索結果を取得できる 55 # 検索条件に該当した商品が@pに格納されているので、 56 # その格納されている値を表示する役割があります 57 end 58 59 private 60 def drink_params 61 params.require(:drink_tag).permit(:name,:price,:explain,:image,:tag_name,:region_id,:body_id,:acidity_id,:processing_id).merge(user_id: current_user.id) 62 end 63 64 def searched_drink_object 65 @p = Drink.ransack(params[:q]) 66 # キー(:q)を使ってDrinksテーブルから商品情報を探しています 67 # @pという名前の検索オブジェクトを生成 68 end 69 70 def set_drink_column 71 @drink_region = Region.all 72 @drink_body = Body.all 73 @drink_acidity = Acidity.all 74 @drink_processing = Processing.all 75 end 76 77 78end 79
drink/index.html.erb
ruby
1<h1> 2 商品検索 3</h1> 4<%= search_form_for @p,url: drinks_searchdrink_path do |f| %> 5<%# search_form_for @p(検索オブジェクトを渡すことで 6 検索フォームを生成しています)%> 7 <%= f.label :body_id_eq, 'コク'%> 8 <%= f.collection_select :body_id_eq,@drink_body,:id,:name %> 9 <%# 第一引数: 検索したいカラム名 10 2: 配列データを指定(今回はdrinkの配列) 11 いわば検索したいカラムのデータ元 12 3: 表示する際に参照するDBのカラム名 13 4: 実際に表示されるカラム名 14 5 何も選択してない時に表示される内容%> 15 <br> 16 <%= f.label :acidity_id_eq, '酸味:' %> 17 <%= f.collection_select :acidity_id_eq, @drink_acidity, :id, :name %> 18 <br> 19 <%= f.label :region_id_eq, '地域:' %> 20 <%= f.collection_select :region_id_eq, @drink_region, :id, :name %> 21 <br> 22 <%= f.label :prosessing_id_eq, '加工法:' %> 23 <%= f.collection_select :processing_id_eq, @drink_processing, :id, :name %> 24 <%= f.submit '検索'%> 25<% end %>
ただこれだと、投稿する際に、地域は「アフリカ」とカテゴリーで選択して投稿したにも関わらず、検索欄に何を入れても検索結果はありませんと表示されてしまいます。
うまいこと検索できる方法があれば教えて欲しいです、ざっくりな質問で申し訳ありません
カテゴリ選択したものがしっかり表示はできてます
こんな感じでカテゴリー検索をしたいです.
ただカテゴリーの設定はactive hashを用いていて、前述した通り、DBではなくモデルに値を書いてます
ruby
1class Region < ActiveHash::Base 2 self.data = [ 3 { id: 1, name: '--' }, 4 { id: 2, name: 'マルチリージョン' }, 5 { id: 3, name: 'ラテンアメリカ' }, 6 { id: 4, name: 'アフリカ' }, 7 { id: 5, name: 'アジア、太平洋' } 8 ] 9end
酸味をlowに選択した時のパラメーターはこれです
[5] pry(#<DrinksController>)> params => <ActionController::Parameters {"q"=><ActionController::Parameters {"body_id_eq"=>"1", "acidity_id_eq"=>"2", "region_id_eq"=>"1", "processing_id_eq"=>"1"} permitted: false>, "commit"=>"検索", "controller"=>"drinks", "action"=>"search_drink"} permitted: false>
検索オブジェクト@pの結果はこれです
条件に一致する結果@resultsの配列は空でした
pry(#<DrinksController>)> @p => Ransack::Search<class: Drink, base: Grouping <conditions: [Condition <attributes: ["body_id"], predicate: eq, values: ["1"]>, Condition <attributes: ["acidity_id"], predicate: eq, values: ["2"]>, Condition <attributes: ["region_id"], predicate: eq, values: ["1"]>, Condition <attributes: ["processing_id"], predicate: eq, values: ["1"]>], combinator: and>> [2] pry(#<DrinksController>)> @results Drink Load (0.5ms) SELECT `drinks`.* FROM `drinks` WHERE (`drinks`.`body_id` = 1 AND `drinks`.`acidity_id` = 2 AND `drinks`.`region_id` = 1 AND `drinks`.`processing_id` = 1) ↳ app/controllers/drinks_controller.rb:52:in `search_drink' => []
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。