此代码不会将预期值上载到数据库。我期待如果2001已经作为具有另一个列站点1(由site_id表示)的记录的student_number值存在,那么我们将student_number增加1,因此该站点的student_number的下一个值将是2002而下一个值2003所以上。但是,由于某种原因,如果存在2001,它只返回值1,然后对于创建的下一条记录,它再次返回值1,依此类推:
学生模特:
def test!
update_attributes :updater_id => User.current_user.id,
:student_number =>
sitenum = self.site_id
count = Student.count_by_sql("SELECT MAX(student_number) FROM students WHERE site_id = #{sitenum}")
if count >= 2001
Student(:condition => { :site_id => sitenum },
:order => "student_number DESC").student_number + 1
else
2001
end
end
学生管理员:
def test_finalize
if @student.update_attributes(params[:student]) && @student.test!
@student.save
end
end
如果存在2001年,如何将其增加1?感谢您的任何建议。
答案 0 :(得分:1)
MySQL does this automatically如果您使用复合主键且只有一个术语自动递增。我不确定其他数据库如何处理它,所以如果你不使用MySQL,你将不得不调查它。
不幸的是,Rails没有开箱即用的复合键。有一个composite_primary_keys plugin。我没有这个插件的经验,所以你的里程可能会有所不同。
编辑:解释为什么代码中的代码不起作用:
看起来你期望if条件的结果是学号。但这就是代码的评估方式。
def test!
update_attributes :updater_id => User.current_user.id,
:student_number => sitenum = self.site_id
count = Student.count_by_sql("SELECT MAX(student_number) FROM students WHERE site_id = #{sitenum}")
if count >= 2001
Student(:condition => { :site_id => sitenum },
:order => "student_number DESC").student_number + 1
else
2001
end
end
结果就是测试!返回您要分配的学号。
此代码执行您所描述的内容:
def test!
new_number = Student.count_by_sql("SELECT MAX(student_number) FROM students WHERE site_id = #{sitenum}") + 1
new_number = new_number > 2000 ? new_number : 2001
update_attributes :updater_id => User.current_user.id,
:student_number => new_number
end