gpt4 book ai didi

mysql - ActiveRecord 的行为不符合我的预期

转载 作者:行者123 更新时间:2023-11-30 00:06:36 25 4
gpt4 key购买 nike

ruby 2.0 window 8.1 rails 4.1MySQL2 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com