凤凰中的级联删除

时间:2018-02-23 10:37:04

标签: elixir phoenix-framework ecto

我有3个型号:

schema "m1s" do
  (...)
  has_many :m2s, MyApp.M2, on_delete: :delete_all
end

schema "m2s" do
  (...)
  belongs_to :m1s, MyApp.M1
  many_to_many :m3s, MyApp.M3, join_through: MyApp.M3sM2, on_delete: :delete_all
end

schema "m3s" do
  (...)
  many_to_many :m2s, MyApp.M2, join_through: MyApp.M2sM3
end

schema "m2s_m3s" do
  (...)
  belongs_to :m2, MyApp.M2
  belongs_to :m3, MyApp.M3
end

从M1删除会触发从M2删除。

从M2删除会触发从M2sM3删除。

所以我假设从M1中删除会触发从M2sM3删除。

但是当我尝试删除M1时,如果m2s_m3表中有元素,我会收到此错误:

** (Postgrex.Error) ERROR 23503 (foreign_key_violation): update or delete on table "m2s" violates foreign key constraint "m2s_m3s_m2_id_fkey" on table "m2s_m3s"

table: m2s_m3s
constraint: m2s_m3s_m2_id_fkey

我错过了什么?有没有办法在凤凰城连锁级联删除?谢谢!

1 个答案:

答案 0 :(得分:0)

您正在寻找的属性通常称为传递性(M1 x M2和M2 x M3,因此M1 x M3)。如果您可以更改数据库架构(例如,使用迁移文件),那么您应该考虑让数据库处理这个问题。在您references(:m1s)的迁移中,您可以添加on_delete: :delete_all,从而生成references(:m1s, on_delete: :delete_all)。其他表也是如此。

另请参阅https://hexdocs.pm/ecto/Ecto.Schema.html :nilify_all和:delete_all不会级联到子记录,除非通过数据库迁移进行设置。