2011-03-19 36 views
0

所以我有我的視頻模型中的這兩種方法。第一個參數store並做一些時髦的數學來返回rounded_num。第二種方法應通過將vote_sum的值傳遞給rank_sum方法,將數據庫中的rank_sum設置爲值rounded_num。以下是方法:爲什麼我的rank_sum數據庫列仍然爲零?

def rank_sum(score) 
    order = Math.log10(([score.abs,1].max)) 

    if score > 0 
    sign = 1 
    elsif score < 0 
    sign = -1 
    else 
    sign = 0 
    end 

    seconds = self.created_at - DateTime.new(1970,1,1) 
    long_num = order + sign * seconds/45000 
    return rounded_num = (long_num * 10**7).round.to_f/(10**7) 
end 

def update_rank_sum 
    new_rank = rank_sum(self.vote_sum) 
    video.update_attributes!(:rank_sum => new_rank) 
end 

但是,rank_sum沒有被設置。每個視頻的rank_sum的值仍然爲零。我該如何解決?

+0

如何調用'update_rank_sum'? – 2011-03-19 23:10:44

+0

我不認爲這是。我認爲它可能已被自動調用,但我猜這個假設是錯誤的。我應該怎麼稱呼它?回調? – 2011-03-19 23:16:25

+0

這就是我需要知道的:)見下面的答案。 – 2011-03-19 23:18:15

回答

1

由於您rank_sum方法不直接與Video模型(例如一個特定的視頻)的實例互動,而不是簡單地做一些計算,我想使它成爲一個類的方法。這也使得您的方法不會覆蓋Active Record自己的rank_sum方法,該方法根據數據庫中的列創建。

改變一些名字更加的描述和你的第一個方法清理return聲明,我會嘗試這樣的事:

class Video < ActiveRecord::Base 
    before_update :update_rank_sum 

    def self.calculate_rank_sum(score, created_at) 
    order = Math.log10(([score.abs,1].max)) 

    if score > 0 
     sign = 1 
    elsif score < 0 
     sign = -1 
    else 
     sign = 0 
    end 

    seconds = created_at - DateTime.new(1970,1,1) 
    long_num = order + sign * seconds/45000 
    (long_num * 10**7).round.to_f/(10**7) 
    end 

    def update_rank_sum 
    self.rank_sum = Video.calculate_rank_sum(self.vote_sum, self.created_at) 
    end 
end 

這會在每次記錄保存時間重新計算rank_sum列。如果您只想在某個字段發生更改時重新計算它,您可以在回調中使用該邏輯。例如,只計算一個新rank_sum如果vote_sum已經改變:

def update_rank_sum 
    if self.vote_sum_changed? 
    self.rank_sum = Video.calculate_rank_sum(self.vote_sum, self.created_at) 
    end 
    true 
end 

您可以vote_sum_changed?與要檢查任何替換列vote_sum

[編輯]您可能需要在回調返回非falsenil值,以確保記錄仍保存(如果從before_回調它將取消保存返回false)。我更新了最後一個代碼塊。

+0

有一個問題。由於這是在視頻模型中,當視頻被創建並保存時,不會只爲該視頻更新一次rank_sum嗎? – 2011-03-19 23:23:17

+0

幾分鐘前我從'before_save'到'before_update'編輯了我的答案,這將在每次保存模型時更新列,而不是僅在第一次保存時更新列。這是你想要的嗎? – 2011-03-19 23:25:10

+0

不完全。發生什麼事是傳遞給'calculate_rank_sum'的vote_sum在用戶投票時會一直改變,所以我想在用戶投票時更新rank_sum。棘手的是投票有它自己的模型VideoVote。 – 2011-03-19 23:27:37

相關問題