2012-06-09 60 views
2

我在Rails中有一個名爲Recipe的模型。配方模型包含成分。每種配料行都與食品模型或其他配方有關聯。所以基本上我想要一個食物模型和食譜模型的多態關聯。但是,當我進行更改時,配料類中的recipe_id始終爲空。這些協會有什麼明顯的錯誤嗎?與其他模型或父模型的多態關聯

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 

所以,基本上爲配方可以包含另一個配方或從食物表(和每個配方可以包含任何數量的成分系)的元素的成分線。

下面是一個圖紙代表什麼,我想:

Drawing of tables

這裏是架構目前看起來如何在RubyMine的:

Rubymine diagram

的問題是在成份,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應該是食品,而不是配方在這種情況下。我不知道該在哪裏設置。

+0

嗯......我想沒有人有任何解決這個:-( – gugguson

回答

2

從我個人理解,一種成分可以同時屬於食品和食譜。如果是這樣的話,那麼你的多態關聯元素將會照顧到這一點。

它會在您的成分表2場,一個叫element_typeelement_id,其中element_type將包含表是涉及到,並element_id將包含記錄的ID在表element_type指。

這使你的belongs_to :recipe冗餘。事實上,Rails會你的「多態域」爲你,當你分配一個成分配方,而不是填充recipe_id,因爲你告訴它通過設置:polymorphic => true填充多態性領域。

我希望這說明你的困境。保持我已經告訴你的想法,看這RailsCast on Polymorphic Associations,事情應該清理。

希望我幫了忙。

+0

要clearify。配方成分有x個,每個成分線是連接到某些食品(如蘋果,牛奶等)或其他配方(就像披薩麪糰一樣,它本身就是一個配方,可以通過配料成爲另一個配方(一些披薩)的一部分),所以你所說的並不完全正確,我認爲 – gugguson

+0

請記住,你永遠不應該循環關係。是一個「邏輯上的」噩夢,你可能最終會陷入無限循環(也就是說,你不應該擁有一種屬於某種成分的配料,它屬於......你有這個想法)。目前,你的成分通過多態性將食譜和食物都歸屬於食物,並且通過正常的關聯再次屬於食譜。這就是爲什麼它被設置爲零(你在問題中提到的問題t你的錯誤是)。 –

+0

現在爲了解決您的問題,爲什麼不在recipe中創建另一個關係,比如'belongs_to:recipe,如::complex_recipes,through :: complex',其中'complex'是包含2個ID字段的連接表,到食譜模型。這樣你就會有多對多的食譜,比如食譜有很多食譜。這將允許你的成分屬於你的模型,你的食譜屬於另一個食譜,而不會在你的關聯中創建循環。隨時與我聯繫。 –