2010-02-16 183 views
0

此代碼不會將預期值上載到數據庫。我期待如果2001年已經存在一個student_number值爲一個記錄有另一個列站點1(由site_id表示),那麼我們將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 

如何通過1,如果2001年的存在是爲了增加它的任何想法?感謝您的任何建議。

+0

,如果一個INSERT到學生表中出現,會發生什麼? –

回答

1

MySQL does this automatically如果您使用的是複合主鍵,只有一個長期的汽車增量。我不確定其他數據庫如何處理它,所以如果你不使用MySQL,你將不得不查看它。

遺憾的是Rails沒有做組合鍵開箱即用。有一個composite_primary_keys plugin。我對這個插件沒有經驗,所以你的里程可能會有所不同。

編輯:爲什麼在這個問題代碼不起作用說明:

它看起來像你期望的,如果條件的結果是學生的數量。但這就是代碼的評估方式。

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 
+0

謝謝,但是當我認爲它應該時,上面的代碼不起作用是有原因的。我不確定它爲什麼不起作用。 – JohnMerlino

+0

該代碼是不完整的,沒有收到完整的方法定義,並知道如何/何時被調用,沒有辦法回答這個問題。 – EmFi

+0

我對它進行了全面更新。它不會在其他任何可能會改變結果的地方使用。 – JohnMerlino