2016-09-13 2 views
1

私は、両方のモデルでhas_many through(HABTMの代わりに)という私のレールモデルに反映されています。IDでフィルタリングし、RailsでカウントするAR

IDが42で、他のユーザーがいないユーザーが含まれているチームをすべて見つけたいとします。これは単純なSQLでは非常に簡単ですが、Rails ARを使ってどのように見えるのか分かりません。

私のモデルはUser,TeamおよびUsersteamです。

+0

あなたはUser.find(42)が –

+0

@Deepakを.teams' 'みましたそれは、ユーザ42が属するすべてのチームを返すだろう。私は、ユーザー42が属し、他のメンバーを持たないすべてのチームを取得したいと思います。 – alexandernst

答えて

1

あなたは複雑な生のSQLを記述する場合を除き、それは2つのクエリにこれを分割するのが最善でしょう:

# assuming Team.table_name == 'teams' 
user = User.find(42) 
required_teams = user.teams.joins(:users).group('teams.id').having('COUNT(*) = 1') 
-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 
+0

なぜこれが下降表示されたのですか?その解決策に何が問題なのですか? – alexandernst

+0

私はこれをテストしただけで動作しません。 'ActiveRecord :: ConfigurationError: 'チーム'を 'usersteam'という名前のアソシエーションに参加できません。おそらく間違っているのでしょうか?」(私はそれが正しいと確信しています)。 – alexandernst

+0

これは、あなたの関連付けの名前付けの方法によって異なります。あなたのチームモデルに 'has_many:usersteams'がある場合、上記のものが動作するはずです。アソシエーションが 'has_many:userteams'と呼ばれる場合は' where(userteams:{user_id:... '。 'has_many:user_teams'の場合は' where(user_teams:... 'など)あなたの 'where'句にあるものとそのアソシエーションが呼ばれるものとをマッチさせます。 – Frost

関連する問題