私は、両方のモデルでhas_many through
(HABTMの代わりに)という私のレールモデルに反映されています。IDでフィルタリングし、RailsでカウントするAR
IDが42
で、他のユーザーがいないユーザーが含まれているチームをすべて見つけたいとします。これは単純なSQLでは非常に簡単ですが、Rails ARを使ってどのように見えるのか分かりません。
私のモデルはUser
,Team
およびUsersteam
です。
私は、両方のモデルでhas_many through
(HABTMの代わりに)という私のレールモデルに反映されています。IDでフィルタリングし、RailsでカウントするAR
IDが42
で、他のユーザーがいないユーザーが含まれているチームをすべて見つけたいとします。これは単純なSQLでは非常に簡単ですが、Rails ARを使ってどのように見えるのか分かりません。
私のモデルはUser
,Team
およびUsersteam
です。
あなたは複雑な生のSQLを記述する場合を除き、それは2つのクエリにこれを分割するのが最善でしょう:
# assuming Team.table_name == 'teams'
user = User.find(42)
required_teams = user.teams.joins(:users).group('teams.id').having('COUNT(*) = 1')
これにより、問題が解決する場合があります。いくつかのSQLフラグメントを混在させていますが、これが純粋なActiveRecordで実行可能かどうかはわかりません。おそらくあなたがArelで混ざり合っているかもしれないが、それはたぶんもっと乱雑になるだろう。
Team.
joins(:usersteams, :users).
where(usersteams: { user_id: 42}).
having("count(usersteams.user_id) = 1").
group("teams.id, usersteams.user_id").
all
なぜこれが下降表示されたのですか?その解決策に何が問題なのですか? – alexandernst
私はこれをテストしただけで動作しません。 'ActiveRecord :: ConfigurationError: 'チーム'を 'usersteam'という名前のアソシエーションに参加できません。おそらく間違っているのでしょうか?」(私はそれが正しいと確信しています)。 – alexandernst
これは、あなたの関連付けの名前付けの方法によって異なります。あなたのチームモデルに 'has_many:usersteams'がある場合、上記のものが動作するはずです。アソシエーションが 'has_many:userteams'と呼ばれる場合は' where(userteams:{user_id:... '。 'has_many:user_teams'の場合は' where(user_teams:... 'など)あなたの 'where'句にあるものとそのアソシエーションが呼ばれるものとをマッチさせます。 – Frost
あなたはUser.find(42)が –
@Deepakを.teams' 'みましたそれは、ユーザ42が属するすべてのチームを返すだろう。私は、ユーザー42が属し、他のメンバーを持たないすべてのチームを取得したいと思います。 – alexandernst