2012-12-14 44 views
1

我有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使它成爲一場噩夢)。 –

回答

2

你可以做到這一點的型號:

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