如何在Rails 3,PostgreSQL中指定现有“唯一键”旁边的“唯一”值?
问题描述:
我有Rails 3.2编写的现有Rails应用程序,并使用PostgreSQL作为数据库引擎。我们的产品表包含来自多个网站的产品。每个产品目前都有唯一的ID。如何在Rails 3,PostgreSQL中指定现有“唯一键”旁边的“唯一”值?
这里是模型:
class Platform < ActiveRecord::Base
attr_accessible :name, :url, :country, :email
validates :name, :presence => true,
:length => { :minimum => 1 }
has_many :sectors
end
和数据库架构此表从schema.rb
create_table "platforms", :force => true do |t|
t.string "name"
t.string "url"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.string "country"
t.string "email"
end
是否有可能再添加一个“唯一密钥”,将禁止入境或新产品使用“URL”参数?我不确定很难用Rails g migration
实现这样的事情,而不会损坏现有记录(如果重复已经存在)。
所以基本上:如果新产品的网址与数据库中已存在的网址相对应,我希望rails禁止添加新产品,类似于我不允许输入ID为1的产品(如果有)数据库中id = 1的产品已经存在。
答
你可以做到这一点的型号:
class MyModel < ActiveRecord::Base
validates_uniqueness_of :url
end
或(取决于您的数据库中,MySQL可以有不同的反应比PGSQL):
# migration file
t.string :url, :null => false, :unique => true
+0
你将不能够,如果有重复已经在数据库中添加一个唯一约束,PostgreSQL的(谢天谢地)将要约束为表的一切是真实的关切。和'validates_uniqueness_of'受到如[所述验证引导]注意到竞争条件(http://guides.rubyonrails.org/active_record_validations_callbacks.html#uniqueness)。 –
我不明白你的要求,你希望每个产品都拥有唯一的网址? – MrYoshiji
我想如果因为我不允许进入产品与ID = 1,如果是在ID = 1的产品,新产品的URL对应的URL已经在数据库中,类似的轨道禁止添加新产品数据库已经。 – Cninroh
PostgreSQL将对您现有的数据执行唯一约束,所以如果您已经有重复项,您将无法添加一个。你必须尝试在你的Rails代码中使用验证来强制你的唯一性(但是这会让你打开竞争条件)或者使用触发器(但Rails使它成为一场噩梦)。 –