根据另一列的值递增一列的值

时间:2010-02-16 16:35:09

标签: ruby-on-rails

此代码不会将预期值上载到数据库。我期待如果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?感谢您的任何建议。

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