###実現したいこと
ruby(ruby on rails)でフォームオブジェクトを使い検索機能をつくっています。
複数のカラムを検索対象とし、
スペースで区切られた複数のキーワードに含むものを取得したいと考えています。
Itemモデルに、item_nameカラムとdescriptionカラムがあるとします。
ユーザーは「ノート 無地」というキーワードを入力したとき、
「ノート」「無地」というワードが含まれたレコードだけを取得します。
言い換えると・・・
item_nameカラムとdescriptionカラムの内容を一つの塊とみなし、
この塊(タイトル+説明文)で「ノート」と「無地」というワードが一緒にあれば取得(and検索)をしたいのですが、
やり方が分からず困っています。
もし、知っている方がいましたら教えて頂ければ幸いです。
###現状のコード
現状のコードでは、
スペース入りの検索内容をスペースで区切って配列化して、
区切った検索内容ごとに検索をそれぞれのカラムで繰り返しています。
(Itemモデルitem_nameカラムで繰り返しor検索).or(Itemモデルdescriptionカラムで繰り返しor検索)
ただし、この場合だと検索ワードの一つに該当すれば取得されてしまい、2つの検索ワードがあるレコードだけを取得することはできません。
form/item_search_form.rb
ruby
1class ItemSearchForm 2 include ActiveModel::Model 3 attr_accessor :all_search 4 5 def search 6 result = Item.all 7 words = all_search.to_s.gsub(/(?:[[:space:]%_])+/, " ").split(" ") 8 query = (["item_name LIKE ?"] * words.size).join(" OR ") 9 query2 = (["description LIKE ?"] * words.size).join(" OR ") 10 11 result = result.where(query, *words.map{|w| "%#{w}%"}).or(ItemStock.where(query2, *words.map{|w| "%#{w}%"})).where(item_stock1_state: 1)#検索ワードがひとつでも含まれていれば取得される。一方でAND検索的な絞込取得はできない 12 result 13 14 end 15end
###環境
Rails 5.1.3
MySQL 5.6.39

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/03 23:05