今回は、 itemsテーブルに保存された商品名(name)と商品説明(description)
と一緒に、tagsテーブルに保存されたタグ名(tag _name)の値の中からキーワード
検索ができる機能の実装を作成したい。
(itemsテーブルとtagsテーブルは多対多の関係で中間テーブルを用いてアソシエーションを組んでいる。)
1 itemモデルに自作のメソッドを作り、それぞれのテーブルからの検索条件を定義し変数に代入(@itemと@sescriptionと@tag)
2 空の配列を作成し変数に代入(@items)
3 eachメソッドにかけて一つの要素として取得し、配列に追加していく。(タグは、一つの商品が複数のタグを持ってることもあるので二重でeachかけてます。)
4 uniqメソッドで、重なる要素を削除します。(例: 「りんご」と検索したときに商品名である@itemと商品説明である@description両方に「りんご」というキーワードが入ってる場合、同じ商品が2つも配列@itemsの中に入ってしまっているため)
5最後に明示的に返り値を記述しデータをparamsに送信(@items)
def self.item_search(search)
if search != ""
@item = Item.where('name LIKE(?)', "%#{search}%")
@description = Item.where('description LIKE(?)', "%#{search}%")
@tag = Tag.where('tag_name LIKE(?)', "%#{search}%")
@items = []
@item.each do |i|
@items << i
end
@description.each do |d|
@items << d
end
@tag.each do |t|
t.items.each do |ta|
@items << ta
end
end
@items = @items.uniq
return @items
else
return nil
end
end
end
6コントローラーで先ほどモデルで作成した「item_searchメソッド」を呼び出す。
def item_search
@items = Item.item_search(params[:keyword])
end
7 配列@itemsに入っている要素をeachメソッドを使って取り出す。
<% @items.each do |i| %>
<% =i.name%>
[割愛]
<% end %>