2012-11-08 100 views
0

我有一個典型的基本問題,我無法找到一個很好的解決方案。讓我們以Rails中的典型多對多關係爲例,用連接表來分配一個值:在導軌中創建新的多對多嵌套模型

Recipe 
    has_many :recipe_ingredients 
    has_many :ingredients, :through => :recipe_ingredients 
    accepts_nested_attributes_for :recipe_ingredients 

Ingredient 
    has_many :recipe_ingredients 
    has_many :recipes, :through => :recipe_ingredients 

RecipeIngredient 
    belongs_to :recipe 
    belongs_to :ingredient 
    attr_accessible :quantity 

這裏沒什麼奇怪的。比方說,現在我想創建一個全新的食譜,全新的食材。我有一些JSON發送到服務器這樣的:

{"recipe"=> 
    {"name"=>"New Recipe", 
    "ingredients"=> 
     [{"name" => "new Ingr 1", "quantity"=>0.1}, 
     {"name" => "new Ingr 2", "quantity"=>0.7}] 
    } 
} 

我想我可以瀏覽PARAMS和創建對象一個接一個,但我一直在尋找到撬動許多-to-many關聯,尤其是所有accepts_nested_attributes_for ,因此能夠執行諸如Recipe.create(params[:recipe])之類的操作,併爲我創建對象樹。如果這意味着要更改正在發送的JSON,這不是問題。 :)

回答

0

的JSON關鍵應該是"ingredients_attributes"

Recipe 
    has_many :recipe_ingredients 
    has_many :ingredients, :through => :recipe_ingredients 
    attr_accessible :ingredients 
    accepts_nested_attributes_for :ingredients # note this 

{"recipe"=> 
    {"name"=>"New Recipe", 
    "ingredients_attributes"=> 
     [{"name" => "new Ingr 1", "quantity"=>0.1}, 
     {"name" => "new Ingr 2", "quantity"=>0.7}] 
    } 
} 
+0

也不要忘了加上'attr_accessible:ingredients'到配方模型,否則你會最終(警告:無法批量分配受保護的屬性) – Ashitaka

+0

您還需要執行'attr_accessible:ingredients_attributes'(除非您將保留JSON密鑰的方法別名保留)。無論如何,這解決了這個問題,但提出了另一個問題,當我想創建兩個食譜與食譜之間共享的新成分...我會有相同的成分創建兩次,但我認爲在這種情況下,我將真的必須導航自我參數。 :/ – Tallmaris