修改ecto many_to_many架构

时间:2018-04-04 10:45:18

标签: elixir phoenix-framework ecto

拥有此架构

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...

总结一下,基本上,我想在删除产品时删除客户。

1 个答案:

答案 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

Documentation for references options