やりたいこと
- Project(案件)
- Genre(ジャンル)
- User(ユーザー)
という3つのモデルがあり、ProjectとGenre
、UserとGenre
にそれぞれ中間テーブルを設けています。
用途としては、「この案件(project)の種類(genre)は"AとB"として登録」
「このユーザー(user)は自分の種類(genre)を登録し、該当するものを対応」みたいな使われ方を想定しています。
エンジニア向けの求人サイトをイメージして貰えると分かりやすいかと思います。
たとえば、あるユーザーが自分の扱える言語(属するジャンル)をあらかじめ登録しておき(例えばRuby
と登録しておく)、
ある求人案件のジャンルが[Ruby,React,AWS,CircleCI,,,]となっていれば、
自分が属するRuby
があるので条件とマッチしている。というような事を実現したいです。
問題点
一度Qiita記事にも書いてあるものがあるので、詳細はこちらを見て頂くと助かるのですが,
「条件がマッチする案件」の一覧を表示させる時、N+1問題を解決させる為に
project.rb
1 scope :search_by_user, ->(user) { 2 includes(genres: :users). 3 where('users.id' => user.id).distinct 4 }
というscopeをproject.rb
で作成したのですが、
各案件のジャンル列で、自分が属するジャンルのものしか表示されないという動作となってしまいました。↓
current_user
が**"A","B","C"**のGenreに属している場合、
↑このように自分が属していないGenreがジャンル列から消えてしまいます。
解決したいこと
このscopeのincludes
をjoins
にすることによって期待の表示がされるようにはなったのですが、
今度はN+1
のSQLクエリをするようになってしまいました。
そこで、解決したい課題は、
`joins`を使ってN+1問題が解決できないか。 もしくは`includes`のままで期待通りの表示がされる方法があるか。
です。よろしくお願いします。

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