执行大型事务时,Validates_uniqueness_of不起作用

时间:2010-01-13 12:44:08

标签: ruby-on-rails validation activerecord transactions

我的ActiveRecord模型中有一个validate_uniqueness_of:字段。当我做一个单独的创建/更新它很好,但我必须从事务中的csv文件做一些大批量创建 当我在事务中时,validate_uniqueness_of没有检测到错误并且模型已保存!

2 个答案:

答案 0 :(得分:3)

是否可以在交易期间创建非唯一值?

验证方法在事务之前检查,然后表中的所有值仍然不存在,因此是唯一的。

编辑:创建一个索引,为您的字段启用了唯一属性,该事务将失败,从而阻止添加非唯一元素。 要做一些,你应该在你的迁移文件中添加一些东西

add_index("tablename", "fieldname", { :name => "fieldname_index", :unique => true })

编辑2:像这样的事务会给出类似“ActiveRecord :: StatementInvalid:Mysql :: Error:重复条目'123'的密钥1:< sql statement here>”错误。

Table.transaction do
  i1 = Table.new
  i1.fieldname = "123"
  i1.save
  i2 = Table.new
  i2.fieldname = "123"
  i2.save
end

答案 1 :(得分:0)

validates_uniqueness_of受竞争条件的限制,您仍需要在数据库上拥有适当的唯一约束。您正在描述this situation。该链接提供了一些解决方案。