【问题标题】:How to implement bidirectional foreign key with ecto如何用ecto实现双向外键
【发布时间】:2021-05-17 22:29:51
【问题描述】:

我是 elixir 编程的新手,我正在尝试在两个表中使用外键迁移两个数据库,但它似乎不起作用??

def change do
  create table(:users) do
    add :username, :string
    add :email, :string
    add :name, :string
    add :password, :string
    add :address, :string


    timestamps()
  end

  alter table("users") do
    add :organization, references(:organization)
  end

end

def change do
  create table(:organization) do
    add :org_key, :string
    add :name, :string

    timestamps()
  end

  create unique_index(:organization, [:org_key])

  alter table("organization") do
    add :creator, references(:users)
  end
end

【问题讨论】:

  • 是的,这可能会失败,因为每个人都需要另一个人。您可能会创建没有引用的 users 表,然后使用对 users 的引用创建 organizations 表,然后更改 users 以添加对 organizations 的引用。因为表在引用时需要存在
  • 为什么不创建两个关系表呢?比如一个user_organization保存组织的用户,另一个organization_creators保存组织创建者?

标签: elixir ecto


【解决方案1】:

目前尚不清楚为什么/为什么您有两种不同的迁移,但正如 @sbacarob 在 cmets 中所说,肯定不能从前者引用不存在的表 :organizations

没有什么神奇的,代码是逐行执行的,在声明之前不能引用任何东西。以下最有可能起作用。

def change do
  create table(:users) do
    …
  end

  create table(:organizations) do
    …
  end

  create unique_index(:organizations, [:org_key])

  alter table("organizations") do
    add :creator, references(:users)
  end

  alter table("users") do
    add :organization, references(:organizations)
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多