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

标签 mysql ruby-on-rails activerecord ruby-on-rails-4

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/

相关文章:

ruby-on-rails - 如果我使用 GUID 作为主键,那么使用 Rails 3.1 的 COMB GUID 是个好主意吗?

ruby-on-rails - 隐藏 ActiveRecord 模型中的属性

php - 如何计算表格中日期的数量

php - 如何按列对分组元素内部进行排序?

ruby-on-rails - 在一页上列出并创建 rails 3

javascript - Ruby on Rails : Validate a user has selected a checkbox

ruby-on-rails - 使用 Ruby 遍历模型中的列

mysql - rails 加入条件查询

javascript - 是否可以让 MySQL 下的数据库将行导出到可通过 Web 访问的托管文件夹中?

ruby-on-rails - Rails 3/ cucumber 问题: "...already activated builder 3.0.0, but your Gemfile requires builder 2.1.2"