如何在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的产品已经存在。

+0

我不明白你的要求,你希望每个产品都拥有唯一的网址? – MrYoshiji

+0

我想如果因为我不允许进入产品与ID = 1,如果是在ID = 1的产品,新产品的URL对应的URL已经在数据库中,类似的轨道禁止添加新产品数据库已经。 – Cninroh

+0

PostgreSQL将对您现有的数据执行唯一约束,所以如果您已经有重复项,您将无法添加一个。你必须尝试在你的Rails代码中使用验证来强制你的唯一性(但是这会让你打开竞争条件)或者使用触发器(但Rails使它成为一场噩梦)。 –

你可以做到这一点的型号:

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)。 –