2011-07-15 10 views
3

OK、最近はgreat answers to a question about how to do some sub-selects in an activerecord queryでした。私は今私が理解できないより複雑な状況があります。ノミとダニの両方を持つユーザーを見つけるにはどうしたらいいですか?

私はとの多対1の関係を持っている3つのテーブル間で検索をしたい:例えば

class User << ActiveRecord::Base 
    has_many :pets 
    has_many :parasites, :through => :pets 
end 

class Pet << ActiveRecord::Base 
    has_many :parasites 
    belongs_to :users 
end 

class Parasite << ActiveRecord::Base 
    belongs_to :pets 
end 

今度は、私はそう

users 

id  name 
1   Bob 
2   Joe 
3   Brian 

pets 

id  user_id animal 
1   1  cat 
2   1  dog 
3   2  cat 
4   3  dog 

parasites 

id  pet_id bug 
1   1   tick 
2   2   flea 
3   3   tick 
4   3   flea 
5   4   tick 
のようないくつかのデータを持っているとしましょう、て

私がしたいのは、ダニとノミの両方を持つペット(つまりユーザー2 - ジョー)を返すアクティブなレコードクエリを作成することです

これは私のactiverecordとsql今までの私のバングラデッシュな試みをあなたに見せてくれる気にしないスキル。

+0

「の両方のノミやダニを持つユーザー」 - の一つである必要があります最高のSOタイトル! –

答えて

1

これはかなり前の質問と同じであり、あなただけのサブ選択に深い1つのレベルを掘るする必要があります。

User.where('id IN (SELECT user_id FROM pets WHERE 
    id IN (SELECT pet_id FROM parasites WHERE bug = ?) AND 
    id IN (SELECT pet_id FROM parasites WHERE bug = ?))', 'flea', 'tick') 
+0

ああ、ありがとう!私はこれを理解し始めている。私は今回の参加が消えたことに気づいた。以前の質問に戻って、実際にあなたの答えは実際には参加しないとうまくいく(重複が消えて、私が理解していると思う)。 – brad

+0

またはSqueelで。 (Parasite.where {bug == 'flea'}。{pet_id}とPet.where {id.in(Parasite.where {bug == 'tick '} .select {pet_id})}。select {user_id})}。Squeelは絶対に素晴らしいようです! – brad

関連する問題