【发布时间】:2010-10-17 23:43:26
【问题描述】:
ActiveRecord 的validates_uniqueness_of 是vulnerable to race conditions。要真正确保唯一性,需要额外的保障措施。 ActiveRecord RDocs 的一个建议是在数据库上创建一个唯一索引,例如通过包含在您的迁移中:
add_index :recipes, :name, :unique => true
这将确保在数据库级别名称是唯一的。但是这种方法的一个缺点是尝试保存副本时返回的ActiveRecord::StatementInvalid 异常不是很有用。在捕获此异常时,无法确定该错误是由重复记录产生的,而不仅仅是由损坏的 SQL 产生的。
正如 RDocs 建议的那样,一种解决方案是解析伴随异常而来的消息,并尝试检测诸如“重复”或“唯一”之类的词,但这很笨拙,并且该消息是特定于数据库后端的。对于SqlLite3,我的理解是消息是完全通用的,根本不能这样解析。
鉴于这对 ActiveRecord 用户来说是一个基本问题,如果有任何标准方法来处理这些异常,那就太好了。我将在下面提出我的建议;请发表评论或提供替代方案;谢谢!
【问题讨论】:
标签: ruby-on-rails database exception activerecord indexing