2012-04-09 4 views

答えて

2
User.where("room_id not in (select id from rooms)") 

が、それはかなり速くなりますので、あなたはこれをしたい:

User.where("not exist (select id from rooms where id=users.room_id)") 

ていますあなたが得ることができる最も近い。 SQL NOT()に変換されるActive Recordクエリを作成する方法はないようです。被験者の検索では、ほとんど同じ回答のSOの質問が返されます。

あなたは

User.all.select { |u| !Room.find_by_id(u.room_id) } 

ような何かを行うことができますしかし、それは再びあまり効率的である可能性があります。

+0

些細でないデータセットで 'User.all'を呼び出すことは非常に危険であり、解決策として提案すべきではありません。 – tadman

3

あなたは、ほぼ文字通りそれを翻訳することができます

User.where('room_id not in (select id from rooms)').all 

where句は、それが受け入れ何で非常に柔軟です。

0

squeel gemに精通しているかどうかわかりません。これにより、純粋なRubyコードで非常に複雑なSQLクエリを構築することができます。あなたのケースでは、それは(あなたのGemfileにgem 'squeel'行を追加してbundle installを実行しているのafer)次のコードのように簡単でなければなりません:試してみる価値

room_ids = Room.select{id}; User.where{room_id.not_in room_ids} 

、そうではありませんか?

ここにはsqueel's pageがあります。

関連する問題