2017-02-12 23 views
0

結合テーブルに存在しないすべてのレコードのリストを取得しようとしています。結合レコードが存在しないアクティブレコード

モデルはUser、Game、MarkedGameで、ユーザーはゲームをプレイしたとマークすることができます。それは、多くの関係に多くのです:

User > MarkedGame < Game 

私ははユーザーによってマークされていないたことを、すべてのゲームのリストで欲しいです。

私は私は2つの別々のクエリを行い、それらを引くことができることを知っている:

Game.all - current_user.games 

しかし、私は、これは配列ではなく、Active Recordの関係オブジェクトで私を残していることが好きではありません。さらに、それを実行するより実行可能な方法があるように思えます。

これを処理するActive Recordの方法がない場合、おそらくSQLの方法はありますか?私の生のSQLは特に強くないので、それについての助けに感謝します。

ありがとうございました。

答えて

1

それはそれを行う必要があります。現在のユーザーによってマークされていないすべてのゲームを返します。

Game.where('id not in (select game_id from marked_games where user_id = ?)', current_user.id) 
+1

パーフェクト!ありがとうございました。 これは基本的にゲームIDがゲームIDのサブクエリにないことを示していますか? –

+0

はい、それは1つのクエリだけなので、データベースに正しいインデックスがある場合はかなり高速です。 – Iceman

+0

すごく、ありがとう。 potashinによるもう1つの答えも完璧に機能しますが、どちらがより良い解決策であるかについての意見はありますか? –

2

あなたは次のことを試すことができます。

Game.where.not(id: MarkedGame.where(user_id: current_user.id).pluck(:game_id)) 
+0

また、完璧に、ありがとう!上記のものよりもあなたの方が良いか悪いかについて意見がありますか?答えとしてどれをマークするかを考えようとする –

関連する問題