如何使用Ecto.Migration约束仅强制执行一个字段

时间:2019-04-11 04:54:42

标签: elixir ecto

我有一个名为Accounts的表,该表必须具有“拥有”该表的用户或组织。我想强制执行一个约束,该约束强制提供了EITHER user_id或organization_id,但没有两者或没有。该表如下所示:

  def change do
    create table(:accounts, primary_key: false) do
      add(:id, :binary_id, primary_key: true)
      add(:user_id, references(:users, type: :binary_id), null: true)
      add(:organization_id, references(:organizations, type: :binary_id), null: true)

      timestamps()
    end

我可以轻松地在变更集中执行此操作,但是我对如何使用Ecto.Migration.constraint使用约束处理此操作很感兴趣。我在围绕如何使用它们以及如何实现我将要使用的方法方面有些头绪。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

  def change do
    # create table

    create constraint(:accounts, :user_or_organization, check: "((organization_id is not null and user_id is null) or (organization_id is null and user_id is not null))")
  end

参考here中的解决方案,这是将其应用于Ecto Migrations的方法。请注意,创建表和约束不必在同一迁移中,您可以稍后添加约束,但是表中不能已有违反该约束的行。