前提・実現したいこと
railsで開発をしていますが、以下の個所で詰まりました。
【前提】
groupsモデル、group_membersモデル、usersモデルの3つが存在し、それぞれ以下の関係を持っています
Ruby
1class Group < ApplicationRecord 2 has_many :group_members, dependent: :destroy 3 has_many :users, through: :group_members 4end
Ruby
1class GroupMember < ApplicationRecord 2 belongs_to :user 3 belongs_to :group 4end
Ruby
1class User < ApplicationRecord 2 has_many :group_members, dependent: :destroy 3 has_many :groups, through: :group_members 4end
グループにはグループメンバーが所属しており、グループメンバーはユーザーマスタに紐づいています。
【やりたいこと】
「グループテーブルにあるカラムAの値が今日以降」かつ、「グループメンバーは自分が所属している」というグループの情報を取得したいです。
取得した結果はViewで、eachで回して、「グループ名」「そのグループに所属するメンバー数」を表示したいです。
n+1問題が発生しないよう、includesを使い、以下のように記述しました。
Ruby
1#groups_controllerの記述 2@group_list = Group.includes(group_members: :user).where("cola > ? AND user_id = ?", Date.today, current_user.id).all 3 4#viewの記述 5<% @group_list.each do |group| %> 6 <tr> 7 <th><%= group.group_name %></th> 8 <th><%= group.group_members.size %>人</th> 9 </tr> 10<% end %>
発生している問題・エラーメッセージ
上記で実施すると、groups,group_members,usersのそれぞれでSQLを発行してくれず、一つのSQLを発行します。
なので、group_members.sizeで値が取れず、countに修正すると値が取れますが、グループの数分、SQLを発行してしまうので、n+1問題が発生します。
試したこと
Group_membersテーブルにあるuser_idへの条件を削れば、期待値を得られました。
親モデルへの条件が子モデルにもある場合は、どうやって記述すればよいでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。