0

在rails 3.2.3中,我想驗證鏈接模型是否有兩個字段的唯一組合。我有一個測試和驗證,如下所示通過測試,但似乎可能有更好的方法來做到這一點。例如,使用具有唯一性的索引會更好嗎?如果是這樣,爲什麼?使用示波器一起驗證兩個字段唯一性的最佳方法

# link_test.rb 
... 
test "cannot create two links with same name and url" do 
    Link.create!(:name => 'example', :url => 'http://www.example.com') 
    assert_raise(ActiveRecord::RecordInvalid, 'could create two links with same name and url'){Link.create!(:name => 'example', :url => 'http://www.example.com')} 
end 
... 

# link.rb 
class Link < ActiveRecord::Base 
    ... 
    validates :name, :uniqueness => {:scope => :url, :message => 'cannot have two entries with same name and url'} 
    ... 
end 

回答

1

我會同時使用兩者。

使用唯一索引的好處是數據庫也會執行它。例如,如果您有六臺應用程序服務器,其中每一臺應用程序服務器都可能創建一條新記錄,那麼在軌中保護唯一性非常難以低估問題。缺點是這很難從中恢復。

在活動記錄中執行此操作的優勢在於,您可以輕鬆調試它,獲取乾淨的異常消息並更有效地將問題傳達給用戶。缺點是它需要額外的查詢,並且更容易受到多線程/多進程類型錯誤的影響。

如果可以結合數據庫唯一索引的絕對可靠性,就可以獲得活動記錄驗證的可恢復性。在兩次請求在同一時刻點擊時,您仍然可以在極少數情況下看到不同的錯誤,但它會使您的數據與您的約束保持一致。