在has_many关联中添加子项时,在父项中增加计数器

时间:2017-06-14 12:19:49

标签: ruby-on-rails

我有一个架构User有很多Studentuser_id字段。

User表格中,我保存的计数器next_student_number的默认值为1roll_number中有Student列。< / p>

Student课程中,我有before_create :generate_roll_number个回调,它将学生的滚动编号设置为next_student_number,并增加User课程中的值。

有些事情是这样的: -

def generate_roll_number
  self.roll_number = user.next_roll_number
  user.increment! :next_roll_number
end

我觉得当两条记录在这里同时尝试保存时会出现问题。要么他们会发生冲突,要么会跳过一些滚动数字。

实施此方法的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我认为这应该可行:

<强>控制器

def create
  Student.transaction do
    Student.create(user_id: current_user, ...)
  end
end

学生模特

before_create :generate_roll_number

def generate_roll_number
  user.increment! :next_roll_number
  # Fires query like
  # UPDATE users SET next_roll_number=2, WHERE id=xxx

  self.roll_number = user.next_roll_number
end

现在,如果保存学生记录时发生任何错误,该事务还将回滚用户表中递增的next_roll_number