2016-06-30 90 views
4

克隆Ecto模型/記錄的最簡單方法是什麼?我有一個有許多配料和嵌入式標籤的樣本食譜模型。克隆一個Ecto記錄。嵌入和相關記錄?

型號

defmodule App.Recipe do 
use App.Web, :model 

schema "recipes" do 
    field :name, :string 
    has_many :ingredients, App.Ingredient 
    embeds_many :labels, App.Label 
end 

克隆配方記錄 我如何可以克隆一個配方記錄,並插入一個新的配方記錄創建變更?

recipe = Repo.get(App.Recipe, 1) 
recipe_changeset = Ecto.Changeset.change(recipe) 

# ... Steps for cloning record with embeds? 

new_recipe = Repo.insert(recipe_changeset) 

克隆配方和成分,並指定新的配方ID配料

我如何克隆預裝的ingrediens配方記錄插入新成分的新配方記錄?

recipe = Repo.get(App.Recipe, 1) 
     |> Repo.preload(:ingredients) 
recipe_changeset = Ecto.Changeset.change(recipe) 

# ... Steps for cloning records?    

new_recipe = Repo.insert(recipe_changeset) 
+0

你也想克隆所有的成分,並將他們的'recipe_id'設置爲新配方的ID,對吧? – Dogbert

+0

是的,我想克隆所有成分並將新配方ID分配給它們。 – rodeinator

回答

0

只需在再次插入標識之前刪除標識。

Repo.get(App.Recipe, 1) 
|> Repo.preload(:ingredients) 
|> whatever_you_wanna_do 
|> Map.delete(:id) 
|> Repo.insert