postgresql - activerecord 对多条记录的唯一约束
问题描述
我应该如何编写 activerecord 迁移来反映这一点:
CREATE TABLE table (
c1 data_type,
c2 data_type,
c3 data_type,
UNIQUE (c2, c3)
);
这会在一列上添加唯一约束,但我正在寻找的是在 2 列的组合上创建唯一约束,如在多列上创建唯一约束部分中所述。
编辑
更准确地说:我有一个表帐户和一个表 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 设置一个约束,其中 peraccount_id
只能value_date
有一个给定数量。金额可以更新,但给定帐户不能有 2 个相同的 value_dates。
解决方案
您添加到另一篇文章的链接并不完全等同于您的请求,因为一个答案谈到通过模型强制执行唯一性,而另一个谈到在您的示例中使用约束时使用索引。(检查此以获取有关它们之间差异的更多信息)。
有两个地方可以强制执行唯一性,即应用程序和数据库,也可以同时在两个地方完成。
数据库
所以如果你想通过使用索引来强制唯一性,你可以使用这个:
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 }
推荐阅读
- jmeter - Jmeter 5.4.1:分布式模式:“连接拒绝主机:嵌套异常是:java.net.ConnectException:连接超时:连接”
- python - For 循环未完全迭代 csv 文件
- python - 单击python中带有硒库的选择中的选项
- c# - 如何在 C# 中使用 xunit 测试变量是否具有字节流
- javascript - 将项目放在映射数组的前面
- c# - 将数据表中的 int 列替换为 DataGridView (Winforms) 的组合框
- excel - 用于检查文本的 Excel 公式
- asp.net-core - 用 dbcontext 中的动态值填充 modelBuilder.Entity
- python - 为什么空 numpy 数组的最大值不是负无穷大?
- powershell - 用于挂载/卸载和删除 ISO 文件的 Bat 文件