在我的 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 来实现这一点,但我还没有找到任何文档显示如何做到这一点。
您没有详细描述您的数据模型,但如果
items
有 users
的外键(我们称之为 user_id
),您可以轻松地在数据库级别强制执行这样的条件。那么你所需要的就是这个部分唯一索引:
CREATE UNIQUE INDEX ON items (user_id) WHERE active;