开发者

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}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜