質問: Rails4でhas_many :throughの多対多のモデルを生成しました。 Userモデル Itemモデル UserItemモデル があります。 このときitem 1もしくはitem 2を持ってるユーザーを検索し、条件に合うユーザーの一覧を取得したいのですが、 ActiveRecordでどのように書いたら良いのでしょうか。
回答: ``` User.joins(:user_items).where({user_items: {item_id: [1,2]}}) ``` とゆう風にもできますが せっかくなので ``` User.joins(:items).where({items: {id: [1,2]}}) ``` とした方がわかりやすいし さらにmergeを使って ``` User.joins(:items).merge(Item.where(id: [1,2])) ``` と書くと文字通り 集合Userと集合Item.where(id: [1,2])をマージ(共通部分をとる)という 中学で習ったベン図のイメージになり、よりRubyonRailsらしい わかりやすい記述になります。 mergeはこのような簡単なところではいまいち有用性がわかりませんが。 関連レコードのscopeを使って複雑なSQLを書くときに重宝します。 いちいちuser.rbで定義し直さなくてもItemのscopeが使えるのです。 覚えておいて損はありませんよ