ruby 2.0 window 8.1 rails 4.1 MySQL2 gem
为了避免错误,我在创建新的付款记录之前使用以下代码检查现有付款:
payment = {"organization_id" => organization_id,
"date" => row[1],
"amount" => row[2],
"description" => row[3]}
slug = "#{organization_id.to_s}_#{row[1].to_s}_#{row[2].to_s}_#{row[3]})
organization_payment = OrganizationPayment.where(:slug => slug)[0]
if !organization_payment
new_organization_payment = OrganizationPayment.create(payment)
end
每隔一段时间,我就会收到以下错误:
Mysql2::Error at /process_uploaded_payments_data
Duplicate entry 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' for key 'index_organization_payments_on_slug'
我的模型中还有以下内容:
validates_uniqueness_of :slug
上面的代码没有捕获导致重复错误的条目是否有任何原因?有什么想法吗?
解决方案
我仍然不确定是什么导致了这个问题,但我通过惨痛的教训了解到,如果您的模型中还有一个 before_save 调用来创建有问题的 slug,那么验证唯一性实际上并不起作用。解决方法是使用异常处理程序:
begin
new_organization_payment = OrganizationPayment.create(payment)
rescue ActiveRecord::RecordNotUnique
next
end
最佳答案
我不知道这是否是您的问题,但可能的原因可能是 race condition -- 当您的代码在进程中运行时,可以在 if 条件之后立即中断,然后再创建新记录。
不过,对数据库中的列设置唯一约束是处理此问题的好方法。您可以捕获异常并以这种方式处理它。您也不必手动检查口是心非,您可以使用事件记录验证;无论如何,获取整个记录只是为了检查它是否存在并不是最佳实践。更多信息:
http://apidock.com/rails/ActiveRecord/Validations/ClassMethods/validates_uniqueness_of
关于mysql - ActiveRecord 的行为不符合我的预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24490992/