验证唯一性:{scope:[:foobar]}无效

Kyl*_*cot 2 ruby validation ruby-on-rails sidekiq

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

class CurriculumRequirement < ActiveRecord::Base

  belongs_to :student

  belongs_to :curriculum_sequence

  validates :student_id,
    uniqueness: { scope: [:curriculum_sequence_id] }
end 
Run Code Online (Sandbox Code Playgroud)

问题是,尽管有这样的验证,但不知何故,重复的记录被插入到我的数据库中.在sidekiq后台工作程序中添加这些记录的位置:

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

认为发生的事情是2个或更多工作人员正在执行相同的代码并保存记录.有没有办法在这个记录上放一个锁或什么东西,这样我就不会重复了?

Mik*_*ham 7

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