前提・実現したいこと
Windows 10 Home
ruby 2.5.1p57
Rails 5.2.4.2
SQLite 3.30.1
Progateで学習を終え、
Ruby on Rails5でショップをまとめ、検索出来るサイトの作成中なのですが、
ジャンル指定でのショップ絞り込み機能の実装中に躓いてしまいました。
Genreモデルは
id | genre_id | floor | name |
---|---|---|---|
1 | 1 | 1 | 本・コミック・雑誌 |
12 | 1 | 2 | 本 |
発生している問題
一つのショップに、同じgenre_idのジャンルを複数設定してある場合
ShopsGenre.where(genre_id: @search_genre.genre_id)では、
同じshop_idを持つデータも抜き取ってしまい、出力すると画像のように
ショップが重複して表示されてしまいます。
現在のソースコードは以下の通りです
ShopsController
1 before_action :set_search_genre 2 3 def set_search_genre 4 @search_genre = Genre.find_by(id: session[:search_genre_id]) 5 end 6 7 def index 8 # session[:search_genre_id]セット 9 if @search_genre 10 @genres = Genre.where(genre_id: @search_genre.genre_id, floor: 2) 11 else 12 @genres = Genre.where(floor: 1) 13 end 14 if params[:genre] 15 @genre = Genre.find_by(id: params[:genre]) 16 session[:search_genre_id] = @genre.id 17 redirect_to("/shops/index") 18 end 19 ----------------------------------------------------------------------------------- 20 if @search_genre 21 if params[:keyword] 22 @shops = Shop.where("name Like ?", "%#{params[:keyword]}%").order(id: :desc) 23 else 24 if @search_genre.floor == 1 25 @hit_shops = ShopsGenre.where(genre_id: @search_genre.genre_id) 26 else 27 @hit_shops = ShopsGenre.where(genre_column_id: @search_genre.id) 28 end 29 if @hit_shops != nil 30 @shops = [] 31 @hit_shops.each do |hit_shop| 32 @shops.insert(0, Shop.find_by(id: hit_shop.shop_id ) ) 33 end 34 end 35 end 36 ----------------------------------------------------------------------------------- 37 else 38 if params[:keyword] 39 @shops = Shop.where("name Like ?", "%#{params[:keyword]}%").order(id: :desc) 40 else 41 @shops = Shop.all.order(id: :desc) 42 end 43 end 44 if @shops 45 @result_amount = @shops.count 46 end 47 end 48
試したこと
ShopsGenre.select(:shop_id).distinctだと、
重複はなくなりますが、where(genre_id: @search_genre.genre_id)の
指定ができないので、genre_idが異なるジャンルを設定してあるショップも
表示されてしまいます。
ShopsGenre.select(:shop_id).distinctと
ShopsGenre.where(genre_id: @search_genre.genre_id)を
両方適用するような処理はどのようにすればいいのでしょうか。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/04 12:04 編集