ransack
を使用した検索フォームを作成し、スペース区切りで複数ワードの検索を実現したいと考えています。
「複数ワードを単一カラムから検索」または「単一ワードを複数カラムから検索」であればできるのですが、「複数ワードを複数カラムから検索」をすることができません。過去に質問されていた方の回答を参考にしてみましたが、スペース区切りで分離する前のSQLが再発行されて上書きされてしまいます。if文
で分岐を作ってみたりもしましたが、うまくいきません。どなたかご教授願えないでしょうか
controller
1before_action :set_search 2 3 def set_search 4 @categories = Category.where(ancestry: nil) 5 if params[:q].present? 6 if params[:q][:title_or_body_or_material_cont_any] != nil 7 texts = params[:q][:title_or_body_or_material_cont_any].split(/[\p{blank}\s]+/) 8 if texts.size >= 2 #複数ワードかどうかの分岐をしないと単一ワードの場合でエラー発生 9 text_queries = texts.map do |text| 10 Recipe.ransack(title_or_body_or_material_cont_any: text).result 11 end 12 text_queries = text_queries.inject{ |scope, query| scope & query } 13 @search = text_queries.inject{ |scope, query| scope.merge(query)} #(title or body or material) and (title or body or material) 14 @search_recipes = @search #「.page(params[:page]).per(8)」をつけるとエラーになる 15 @text_queries = text_queries #中身の確認用 16 end 17 end 18 @search = Recipe.ransack(params[:q]) #おそらくここでSQLの上書きが発生? 19 @search_recipes = @search.result.page(params[:page]).per(8) 20 else 21 params[:q] = { sorts: 'created_at desc'} 22 @search = Recipe.ransack() 23 @search_recipes = @search.result.page(params[:page]).per(8) 24 end 25 end
試行錯誤しているため、滅茶苦茶なソースですが簡潔な書き方も併せて教えて頂けたら幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/30 14:49
2020/10/31 17:18