微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

activerecord 对多条记录的唯一约束

如何解决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 举报,一经查实,本站将立刻删除。