我有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
我错过了什么?有没有办法在凤凰城连锁级联删除?谢谢!
答案 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不会级联到子记录,除非通过数据库迁移进行设置。