2011-03-19 33 views
1

所以我在我的視頻模型的方法:我應該如何更新這個數據庫列?

def rank_sum(score, video) 
... 
... 
end 

返回,我想在我的數據庫存儲在rank_sum列中的特定影片的值。

我也是爲了我的視頻,像這樣:

default_scope order('videos.rank_sum') 

現在我的問題是我應該如何更新rank_sum列?有回調?我應該多久更新一次?

回答

1

我建議您不要創建與模型的任何自動創建的屬性衝突的方法,因爲這會干擾內置的Rails功能,例如表單生成。每個update_rank_sum方法被調用時

def update_rank_sum(score) 
    new_rank = self.rank_sum + score # Or substitute whatever logic is necessary here. 
    update_attribute :rank_sum, new_rank 
end 

這將更新數據庫中的值(如有必要):

你可以簡單地重寫你的方法如下。

如果你想推遲rank_sum值的更新,直到以後的某個時候,你可以改變執行如下命令:

def update_rank_sum(score) 
    new_rank = self.rank_sum + score # Or substitute whatever logic is necessary here. 
    self.rank_sum = new_rank 
end 

但請記住,你將需要調用saveVideo實例堅持對數據庫的更改。

更新單個行的一個字段很可能會使您的數據庫以毫秒爲單位,因此除非您知道需要每秒處理10或100次更改,否則我不會擔心性能太高。

+0

我應該在VideoVote模型中使用'update_rank_sum'回調函數(我的投票是在哪裏處理的)? – 2011-03-19 20:14:21

+0

另外,在這種情況下,'self'是指'Video',對吧? – 2011-03-19 20:15:32

+0

當你需要傳入方法參數時,回調函數並不真正起作用。在我的第一個例子中,數據庫更新是立即進行的。第二,你需要在調用update_rank_sum之後調用保存視頻。是的,'self'指的是方法的接收者,如果你已經在'Video'類中定義了這個方法,'self'就是'Video'實例。 – npad 2011-03-19 20:49:16

0

「更新時間/更新頻率」的答案將更多地取決於方法的內容。假設該方法返回相同的值,除非有關視頻對象的變化,並且沒有外部依賴關係,那麼它將很適合放入before_save回調。但是,如果rank_sum方法具有外部依賴關係(例如可能從評級表中讀取),那麼對於您希望更新數據庫中該值的頻率而言,這可能更多是「業務決策」,可能或多或少地比before_save回調會觸發它。

UPDATE

一個例子:

before_save :set_rank_sum 

private 

    def set_rank_sum 
    self.rank_sum = rank_sum(value1, value2) 
    end 
+0

很酷,你能提供一個回調的例子嗎?我不知道如何處理回調時,方法有參數... – 2011-03-19 19:56:53

+0

更新後的一些代碼,讓你開始。 – ctcherry 2011-03-19 20:00:32

+0

這不是隻能設置rank_sum而不更新嗎? – 2011-03-19 20:11:04

0

我能想到的兩種選擇:當一個新的投票

  1. 更新。這可能是好的,因爲你可以在這個字段上有一個索引。
  2. 每1小時左右更新一次cron。
+0

我會假設在每次新的投票中更新它可能會對性能產生負面影響?另外,我從未使用過cron。關於如何開始使用它的任何好的資源? – 2011-03-19 19:58:39

+0

我喜歡用[時](https://github.com/javan/whenever)創業板與鐵軌應用 – ctcherry 2011-03-19 20:01:47

+0

crons我不這麼認爲。畢竟,你只是更新一筆款項。一個cron對你來說很容易,更多的信息請看看:http://www.codercaste.com/2009/11/24/how-to-backup-mysql-databases-automatically-using-cron/ – Spyros 2011-03-19 20:03:19

相關問題