Rails与连接表的多态关联

时间:2012-08-26 15:37:01

标签: ruby-on-rails polymorphic-associations

我有一张名为食谱的表和另一种名为成分的表。配料可以连接到食物或食谱(一个食谱可以包含其他食谱)。我用它的食物部分实现了它,但我不确定如何实现它的配方部分。我创建了另一个名为recipe_as_ingredients的食物部分的表格,当食谱被选为当前食谱中的食谱时,我将会填充这些食谱。我可能必须在每次保存之前更新表,并在删除配方时手动删除行。是否有更好的实施方式?

以下是模型:

class Recipe < ActiveRecord::Base
  has_many :ingredients
end

class Ingredient < ActiveRecord::Base
  belongs_to :element, :polymorphic => true
  belongs_to :recipe
end

class Food < ActiveRecord::Base
  has_many :ingredients, :as => :element
end

class RecipeAsIngredient < ActiveRecord::Base
  has_many :ingredients, :as => :element
end

我在保存之前手动设置了一个函数中的元素类型,所以我需要将相似的配方作为成分,但要确保recipe_as_ingredient包含连接到该成分的记录:

self.element_id = numid.id
self.element_type = 'Food'

P.S。如果没有recipe_as_ingredients连接表,我无法连接配方,因为它使得记录无法保存,因为配方既是主记录又是详细记录,而且id字段总是为零。

1 个答案:

答案 0 :(得分:0)

你真是太近了。

移动:    has_many:成分,:as =&gt; :元素

在Recipe模型上。

RecipeAsIngrident应该存在。如果你想获得食谱中使用的所有食物,那么你想要一个Recipe功能来总结后代。这将是一个计算的总数,因此您不需要回调来更新总数等,但是我会添加逻辑以防止删除用于其他内容的配方。

询问您是否需要进一步澄清。