我有一个架构User
有很多Student
个user_id
字段。
在User
表格中,我保存的计数器next_student_number
的默认值为1
,roll_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
我觉得当两条记录在这里同时尝试保存时会出现问题。要么他们会发生冲突,要么会跳过一些滚动数字。
实施此方法的最佳方法是什么?
答案 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
值