拥有此架构
many_to_many :customers, User,
join_through: Customer, on_replace: :delete
我想添加一个on_delete子句:
on_delete: :delete_all
所以我用
修改了架构many_to_many :customers, User,
join_through: Customer, on_replace: :delete,
on_delete: :delete_all
并且创建了一个迁移,但由于它是多对多的并且它创建了一个新表我不知道你如何引用该字段,我已经搜索了ecto文档但是找不到覆盖这个案例的例子:
defmodule Migration do
use Ecto.Migration
def change do
alter table(:products) do
modify :customers, references(:customers, on_delete: :delete_all)
end
end
end
但是在运行迁移时,它显然告诉我列客户不存在:
(undefined_column):关系“产品”的列“客户”没有 存在
在iex上,它显示为一个ecto协会
customers: #Ecto.Association...
总结一下,基本上,我想在删除产品时删除客户。
答案 0 :(得分:1)
对于many_to_many关系,必须使用连接表。 例如,用户可能有许多角色,而角色可能属于许多用户......
schema "users" do
field(:username, :string)
many_to_many(:roles, Role, join_through: UserRole, on_replace: :delete, on_delete: :delete_all)
schema "users_roles" do
belongs_to(:user, User)
belongs_to(:role, Role)
schema "roles" do
field(:name, :string)
# optional - if you need to use the relationship in the "reverse" direction.
# many_to_many(:users, User, join_through: UserRole)
Documentation for many_to_many options
表中的外键对应于架构中的belongs_to
create table(:users, primary_key: false) do
add :id, primary_key: true
add :username, :string, null: false
end
create table(:users_roles, primary_key: false) do
add :user_id, references(:users, on_delete: :delete_all), null: false
add :role_id, references(:roles, on_delete: :delete_all), null: false
end
create table(:roles, primary_key: false) do
add :id, :binary_id, primary_key: true
add :name, :string, null: false
end