0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

複数のモデルが絡んだ検索条件の作り方

Last updated at Posted at 2020-09-05

今回は、 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)

item.rb
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メソッド」を呼び出す。

items-controller.rb
 def item_search
    @items = Item.item_search(params[:keyword])
  end

7 配列@itemsに入っている要素をeachメソッドを使って取り出す。

item_search.html
<% @items.each do |i| %>
  <% =i.name%>
[割愛]
<% end %>


0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?