如何解决activerecord 对多条记录的唯一约束
我应该如何编写 activerecord 迁移来反映这一点:
CREATE TABLE table (
c1 data_type,c2 data_type,c3 data_type,UNIQUE (c2,c3)
);
This 为一列添加唯一约束,但我正在寻找的是对 2 列的组合创建唯一约束,如 Creating a UNIQUE constraint on multiple columns 部分所述。
编辑
更准确地说:我有一个表帐户和一个表 balance_prevIoUs_month。
class CreateBalance < ActiveRecord::Migration[6.1]
def change
create_table :balance_prevIoUs_month do |t|
t.decimal :amount,:precision => 8,:scale => 2
t.date :value_date
t.belongs_to :account,foreign_key: true
t.timestamps
end
end
end
由于我们在 1 月份,因此起息日(即上月末的余额)是 2020-12-31
。
我想对表 balance_prevIoUs_month 设置一个约束,其中每个 account_id
只能有一个 value_date
具有给定的数量。金额可以更新,但给定的帐户不能有 2 个相同的 value_dates。
解决方法
您添加到另一篇文章的链接并不完全等同于您的请求,因为一个答案谈到通过模型强制执行唯一性,而另一个则谈到在您的示例中使用约束时使用索引。 (查看 this 以了解有关它们之间差异的更多信息)。
您可以在应用程序和数据库这两个地方强制执行唯一性,并且也可以同时在这两个地方执行。
数据库
所以如果你想通过使用索引来强制唯一性,你可以使用这个:
def change
add_index :table,[:c2,:c3],unique: true
end
如果你想在你的例子中添加一个约束,你将不得不在你的迁移中运行一个直接的 sql 查询,因为 rails 中没有内置的方法来做到这一点。
def up
execute <<-SQL
ALTER TABLE table
ADD UNIQUE (c2,c3)
SQL
end
查看上面的链接以了解有关它们之间差异的更多信息。
应用
通过模型强制独特性:
validates :c2,uniqueness: { scope: :c3 }
,
感谢 Daniel Sindrestean,此代码有效:
class CreateBalance < ActiveRecord::Migration[6.1]
def change
create_table :balance_previous_month do |t|
t.decimal :amount,:precision => 8,:scale => 2
t.date :value_date
t.belongs_to :account,foreign_key: true
t.timestamps
end
execute <<-SQL
ALTER TABLE balance_previous_month
ADD UNIQUE (account_id,value_date) # ActiveRecord creates account_id
SQL
end
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。