【问题标题】:validates uniqueness: { scope: [:foobar] } not working验证唯一性:{ scope: [:foobar] } 不工作
【发布时间】:2014-05-08 12:42:47
【问题描述】:

我有一个具有唯一性验证的模型,例如:

class CurriculumRequirement < ActiveRecord::Base

  belongs_to :student

  belongs_to :curriculum_sequence

  validates :student_id,
    uniqueness: { scope: [:curriculum_sequence_id] }
end 

问题是,尽管进行了验证,但以某种方式重复的记录被插入到我的数据库中。添加这些记录的地方发生在 sidekiq 后台工作人员中:

student.curriculum_requirements.where(curriculum_sequence: sequence).first_or_create

认为正在发生的事情是 2 个或更多工作人员正在执行相同的代码并保存记录。有没有办法在这条记录上加锁或其他东西,这样我就不会得到重复?

【问题讨论】:

  • sidekiq background worker 是的,当它在几个线程中工作时会发生这种情况。您应该包括一些储物柜,或设置 sidekiq 以在一个线程中工作。
  • 如果是储物柜,您可以使用Model.transaction { ... } link。如果有帮助,请告诉我,我将其发布为答案。
  • sidekiq docs 上也有一些信息,但我认为你可以避免这种情况。交易应该足够了。
  • 为什么不使用数据库唯一约束?

标签: ruby-on-rails ruby validation sidekiq


【解决方案1】:

Rails 不能保证唯一性。您需要在数据库中[curriculum_sequence_id, student_id] 上的表上创建唯一索引。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
相关资源
最近更新 更多