2013-02-22 111 views
0

我需要通过关联模型查询我的模型。通过关联查询模型有很多通过关联

伪代码: @drinks = Drink.where(drink.ingredients在cabinet.ingredients)

饮料模型

class Drink < ActiveRecord::Base 
    attr_accessible :name 

    has_many :recipe_steps, :dependent => :destroy 
    has_many :ingredients, through: :recipe_steps 
end 

配料模型

class Ingredient < ActiveRecord::Base 
    attr_accessible :name 

    has_many :recipe_steps 
    has_many :drinks, through: :recipe_steps 
    has_many :cabinet_ingredients 
    belongs_to :cabinet 
end 

用户模型

class User < ActiveRecord::Base 

    has_one :cabinet 
end 

编辑:建议我尝试

​​

但是它返回同饮的多个记录时,我有一个饮料与我的内阁和/或多个用户2种成分。

我需要回到只有一个饮料的记录。此外,我只需要返回的饮料,如果它的所有成分在内阁

+0

关于下面的答案:如果你想消除重复记录,你可以在你的'@ drinks'数组上调用'.uniq'。 – 2013-02-23 00:09:51

+0

好的,但我如何缩小到特定用户? – BrianJakovich 2013-02-23 01:35:05

回答

1

这是我该怎么做的。如果所有的食材都存在于特定的食材原料中,请选择一杯饮品。我知道它不像你的伪代码那样使用Drink.where,但它可以完成工作。

Drink.all.select{|drink| drink.ingredients.all?{|drink_ingredient| cabinet.ingredients.include?(drink_ingredient)}} 
+0

当你有很多饮料时,这会很慢 – 2013-02-23 03:37:30

+1

这个工程。我去建立了一个sql语句来做到这一点,我很确定它做了同样的事情从recipe_steps中选择独特的drink_id,其中drink_id不在(从recipe_steps中选择不同的drink_id左加入cabinet_ingredients我在i.ingredient_id = r.ingredient_id其中i.ingredient_id为空) – BrianJakovich 2013-02-23 04:12:40

0

尝试这个匹配。

Drink.joins(ingrediants: :cabinet_ingredients).uniq 
+0

与此有关的2个问题。当我的橱柜中有多种配料,而且我有多种配料的饮料时,它会针对两种配料查询返回相同的饮料。此外,如果我有2个用户,它会返回饮料两次,每个用户 – BrianJakovich 2013-02-22 23:11:26

+0

嗯。在这种情况下,'.uniq'应该可以完成这项工作。 – 2013-02-23 00:21:01