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
4

1 回答 1

1

我会同时使用。

使用唯一索引的优点是数据库也会强制执行它。例如,如果您有六台应用程序服务器,每台服务器都可能创建一条新记录,那么保护 Rails 中的唯一性就很难低估这个问题。缺点是这更难恢复。

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

通过这两者,您可以获得活动记录验证的可恢复性,当它可能与数据库唯一索引的绝对可靠性相结合时。当两个请求同时发生时,您仍然可以在极少数情况下看到不同的错误,但它会使您的数据与您的约束保持一致。

于 2012-05-31T21:10:40.923 回答