迁移以将唯一约束添加到列组合
我需要的是一个迁移到一个列的组合应用独特的约束。
即
对于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