Validation 使用rails中的作用域一起验证两个字段唯一性的最佳方法

Validation 使用rails中的作用域一起验证两个字段唯一性的最佳方法,validation,ruby-on-rails-3.2,unique,validates-uniqueness-of,Validation,Ruby On Rails 3.2,Unique,Validates Uniqueness Of,在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')

在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
#link_test.rb
...
测试“无法创建具有相同名称和url的两个链接”是否执行
链接。创建!(:name=>'example',:url=>'http://www.example.com')
assert_raise(ActiveRecord::RecordInvalid,'可以创建两个具有相同名称和url的链接'){Link.create!(:name=>'示例',:url=>'http://www.example.com')}
结束
...
#link.rb
类链接{:scope=>:url,:message=>'不能有两个名称和url相同的条目'}
...
结束
我会两者都用

使用唯一索引的优点是数据库也将强制执行它。例如,如果您有六台应用程序服务器,每台服务器都可能创建一个新记录,那么在rails中保护唯一性是非常困难的。缺点是这很难恢复

在活动记录中执行此操作的优点是,您可以轻松地调试它,获得干净的异常消息,并更有效地将问题传达给用户。缺点是它需要额外的查询,并且更容易出现多线程/多进程类型的错误

通过这两种方法,您可以获得活动记录验证的可恢复性,同时还可以获得数据库唯一索引的绝对可靠性。当两个请求在同一时刻命中时,您仍然可以在极少数情况下看到不同的错误,但这将使您的数据与约束保持一致