我在Rails中有一个名为Recipe的模型。食谱模型包含成分。每种成分系列与食物模型或其他食谱有关联。所以基本上我想要一个与Food模型和Recipe模型的多态关联。但是,当我进行更改时,成分类中的recipe_id始终为null。协会中有明显的错误吗?
class Recipe < ActiveRecord::Base
has_many :ingredients, :as => :element
end
class Food < ActiveRecord::Base
has_many :ingredients, :as => :element
has_many :recipes, :through => :ingredients
end
class Ingredient < ActiveRecord::Base
belongs_to :element, :polymorphic => true
belongs_to :recipe
end
因此,食谱的配料行基本上可以包含另一个食谱或食物表中的元素(每个食谱可以包含任意数量的成分行)。
这是一张代表我想要的图画:
以下是架构在RubyMine中的显示方式:
问题是成分行中的recipe_id(它是父表)现在为null,所以当我开始实现多态关联时,关系已停止工作。
以下是保存食谱时的插入行:
SQL (3.4ms) INSERT INTO "recipes" ("created_at", "description", "directions", "name", "owner", "recipe_source_type_id", "servings", "source", "time", "updated_at", "visibility") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING "id" [["created_at", Sun, 10 Jun 2012 13:43:12 UTC +00:00], ["description", "Þetta er önnur prufuuppskrift"], ["directions", "Já, og leiðbeiningar"], ["name", "Prufuuppskrift II"], ["owner", 1], ["recipe_source_type_id", 1], ["servings", 3], ["source", "aaa"], ["time", 3], ["updated_at", Sun, 10 Jun 2012 13:43:12 UTC +00:00], ["visibility", 0]]
SQL (0.9ms) INSERT INTO "ingredients" ("created_at", "description", "element_id", "element_type", "order", "qty", "recipe_id", "unit_type_id", "updated_at", "user_entered_qty") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING "id" [["created_at", Sun, 10 Jun 2012 13:43:13 UTC +00:00], ["description", "abc"], ["element_id", 9], ["element_type", "Recipe"], ["order", nil], ["qty", 2.0], ["recipe_id", nil], ["unit_type_id", 1], ["updated_at", Sun, 10 Jun 2012 13:43:13 UTC +00:00], ["user_entered_qty", "2 gramm"]]
之后我要解决的另一个问题是,在这种情况下,element_type应该是Food而不是recipe。我不确定在哪里设置它。
答案 0 :(得分:2)
根据我的理解,一种成分可以同时属于食物和食谱。如果是这种情况,那么您的多态关联元素将负责这一点。
它会在您的Ingredients表中创建两个字段,一个名为element_type
和element_id
,其中element_type
将包含与其相关的表,element_id
将包含element_type
引用的表中记录的ID。
这使您的belongs_to :recipe
变得多余。事实上,当你将一个成分分配给一个食谱时,Rails会为你填充你的“多态字段”,而不会填充recipe_id,因为你已经告诉它通过设置:polymorphic => true
来填充多态字段。
我希望这能解释你的困境。保持我告诉你的内容,看看RailsCast on Polymorphic Associations,事情应该清理。
希望我帮助过。