【发布时间】:2017-10-15 05:16:20
【问题描述】:
我有一个带有 has_many 关联的架构,其中 :on_replace 选项设置为 :delete。我有一个带有一组复选框的表单,用于提交新值作为与父实体的关联。我希望在编辑时删除所有以前设置的关联,但是我将新关联插入到数据库中,而旧关联仍然保留在数据库中。
提交后的变更集只有新的关联,没有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
我们可以让 Ecto 在编辑时从数据库中清除所有以前提交的关联值吗?
【问题讨论】:
标签: elixir phoenix-framework ecto