Rails 3 Many-to-many query
Hello I want to create a quer开发者_如何转开发y that goes something like this, "Get me the variety which has the following ingredients(1,2,3)"
Here are my models
class Ingredient < ActiveRecord::Base
has_and_belongs_to_many :varieties
class Variety < ActiveRecord::Base
has_and_belongs_to_many :ingredients
I have been breaking my head but I haven't been able to get it right, can someone help me out please. Thanks in advance!
Corrected after Dylan's comment. I broke up the where_clause into a multi-line string for readability sake.
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)
Don't know about performance(and we know not to optimize prematurely), but this is definitely more readable than pure SQL:
@ingredients = Ingredient.includes(:varieties).find [1,2,3]
@varieties = @ingredients.collect(&:varieties).inject(&:&).reject{|v| v.ingredients.size != @ingredients.size}
精彩评论