2017-10-15 54 views
0

不工作我得帶的has_many協會的模式:設置爲on_replace選項:刪除。而且我已經有了一組複選框來提交新的值作爲關聯到父實體。我想在編輯要刪除所有以前設置的關聯,而是我得到新的關聯插入到數據庫中,老依然在數據庫中持久。外生的:on_replace:刪除選項的has_many協會

的變更提交後,只有沒有ID在它的變化新的關聯,就像這樣:

%{materials: [#Ecto.Changeset<action: :insert, 
    changes: %{material: "Cast iron"}, errors: [], 
    data: #HrPro.Entities.Material<>, valid?: true>, 
    #Ecto.Changeset<action: :insert, 
    changes: %{material: "Steel"}, errors: [], 
    data: #HrPro.Entities.Material<>, valid?: true>]} 

正如你可以看到有沒有:在變更ID字段,因此我預計,先前保存的材料將從數據庫中刪除,但事實並非如此。

的模式是這樣的:

schema "entities" do 
    has_many :materials, Material, on_replace: :delete 
end 

def changeset(%Entity{} = entity, attrs \\ %{}) do 
    entity 
    |> cast(attrs, @allowed_fields) 
    |> cast_assoc(:materials) 
end 

我安裝的是:

phoenix 1.3 
ecto 2.2.6 

我們能否外生從上編輯數據庫清除所有先前提交的相關值?

回答

0

看來,如果財產on_replace:被設置爲:刪除架構中的一些關聯,當這種結構創建變更,外生會自動將用行動改變:更換每個先前保存的關聯。

在我的情況下,問題是我使用新的行動::忽略 ecto的功能,不允許Ecto用空值污染我的數據庫(如果相應的複選框未被選中)。 而這個功能只是刪除所有從變更空協會包括那些用行動改變:替換那些需要外生從數據庫中刪除。

當我停止忽略空值,一切運行正常。