2011-07-19 5 views
1

こんにちは、私はここでRailsの3多対多のクエリ

「私に次の成分を持っている様々な(1,2,3)を取得します」あり、このような何かを行くクエリを作成したいです私のモデル

class Ingredient < ActiveRecord::Base 
    has_and_belongs_to_many :varieties 

class Variety < ActiveRecord::Base 
    has_and_belongs_to_many :ingredients 

私は私の頭を壊してきたが、私はそれが権利を取得することができていない、誰かが私をしてください助けることができます。前もって感謝します!

答えて

3

ディランのコメント後に修正されました。私は可読性のためにwhere_clauseを複数行の文字列に分割しました。

ingredient_list = [1,2,3] 
where_clause = %{ 
varieties.id IN 
(SELECT v.variety_id FROM 
(SELECT variety_id, count(*) as cnt FROM ingredients_varieties WHERE ingredient_id in (#{ingredient_list.join(',')}) GROUP BY variety_id) v 
WHERE v.cnt = #{ingredient_list.size}) 
} 
Variety.where(where_clause) 
+0

私は、このことをあなたに 'Variety'を与えるだろうと思います私は彼がそれが3つのすべての成分を含めることを望んでいると思うのに対し、少なくとも1つの成分を持っています。 –

+0

まず最初にありがとうございます...最初のクエリはすばらしく見えましたが、問題は、バラエティーが必要なことです。少なくとも1つではなく、これらの成分を含んでいます。 – rogeliog

+0

質問に答えるために編集 –

1

はパフォーマンスを知ってはいけない(と私たちは途中で最適化することではない知っている)が、これは間違いなく、純粋なSQLよりも読みやすいです:

@ingredients = Ingredient.includes(:varieties).find [1,2,3] 
@varieties = @ingredients.collect(&:varieties).inject(&:&).reject{|v| v.ingredients.size != @ingredients.size} 
+0

ねえ、問題は少なくとも(1,2,3)成分を含んでいれば品種が得られるということです。しかし、品種にも(4)成分が含まれていればそれも得られ、正確に(1,2,3)成分が含まれている場合にのみ品種を取得する必要がありますが、どうもありがとうございます – rogeliog

+0

@rogeliog 3つ以上の成分を含む品種。 – RocketR