迁移以将唯一约束添加到列组合

我需要的是一个迁移到一个列的组合应用独特的约束。

对于Person表,Firstname,LastName和Dob的组合应该是唯一的。

add_index :people, [:firstname, :lastname, :dob], :unique => true

根据howmanyofme.com的统计,仅美国就有46247人叫John Smith。 那大约是127年的日子。 由于这远远超过了人类的平均寿命,这意味着DOB冲突在math上是确定的。

我只是说,独特的领域的特定组合可能会导致未来极度的用户/客户的挫折。

考虑一些实际上是独一无二的东西,如果适当的话,就像一个国家识别码。

(我意识到这个晚会对我来说很晚,但是可以帮助未来的读者。)

你可能想添加一个没有索引的约束。 这将取决于你正在使用的数据库。 以下是Postgres的示例迁移代码。 (tracking_number, carrier)是您想要用于约束的列的列表。

 class AddUniqeConstraintToShipments < ActiveRecord::Migration def up execute <<-SQL alter table shipments add constraint shipment_tracking_number unique (tracking_number, carrier); SQL end def down execute <<-SQL alter table shipments drop constraint if exists shipment_tracking_number; SQL end end 

你可以添加不同的约束条件。 阅读文档

嗨你可以添加唯一的索引在你的迁移到列例如

 add_index(:accounts, [:branch_id, :party_id], :unique => true) 

或为每列分开唯一的索引

在用户和post之间的连接表的典型示例中:

 create_table :users create_table :posts create_table :ownerships do |t| t.belongs_to :user, foreign_key: true, null: false t.belongs_to :post, foreign_key: true, null: false end add_index :ownerships, [:user_id, :post_id], unique: true 

试图创build两个相似的logging会抛出一个数据库错误(Postgres在我的情况):

 ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_ownerships_on_user_id_and_post_id" DETAIL: Key (user_id, post_id)=(1, 1) already exists. : INSERT INTO "ownerships" ("user_id", "post_id") VALUES ($1, $2) RETURNING "id" 

例如这样做:

 Ownership.create!(user_id: user_id, post_id: post_id) Ownership.create!(user_id: user_id, post_id: post_id) 

完全可运行的示例: https : //gist.github.com/Dorian/9d641ca78dad8eb64736173614d97ced

db/schema.rb生成: https : db/schema.rb