使用 Ecto 检查复杂的唯一约束

问题描述 投票:0回答:1

在我的 Ecto 模式中,我有一个 User,其

has_many
Items。一个项目有一个布尔字段 active:

用户模块:

  schema "users" do
    field :name, :string
    has_many :items, Item
  end

物品模块:

  schema "items" do
    field(:active, :boolean)
    belongs_to(:user, User)
  end

如何确保用户最多有一项处于活动状态?因此,如果用户已经有一个活动项目,则插入另一个活动项目应该会导致错误。不过,使用

active: false
插入新项目应该会成功。

似乎可以使用 exclusion_constraint 来实现这一点,但我还没有找到任何文档显示如何做到这一点。

postgresql elixir constraints ecto
1个回答
2
投票

您没有详细描述您的数据模型,但如果

items
users
的外键(我们称之为
user_id
),您可以轻松地在数据库级别强制执行这样的条件。那么你所需要的就是这个部分唯一索引:

CREATE UNIQUE INDEX ON items (user_id) WHERE active;
© www.soinside.com 2019 - 2024. All rights reserved.