所以我在我的視頻模型的方法:我應該如何更新這個數據庫列?
def rank_sum(score, video)
...
...
end
返回,我想在我的數據庫存儲在rank_sum
列中的特定影片的值。
我也是爲了我的視頻,像這樣:
default_scope order('videos.rank_sum')
現在我的問題是我應該如何更新rank_sum
列?有回調?我應該多久更新一次?
所以我在我的視頻模型的方法:我應該如何更新這個數據庫列?
def rank_sum(score, video)
...
...
end
返回,我想在我的數據庫存儲在rank_sum
列中的特定影片的值。
我也是爲了我的視頻,像這樣:
default_scope order('videos.rank_sum')
現在我的問題是我應該如何更新rank_sum
列?有回調?我應該多久更新一次?
我建議您不要創建與模型的任何自動創建的屬性衝突的方法,因爲這會干擾內置的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
但請記住,你將需要調用save
在Video
實例堅持對數據庫的更改。
更新單個行的一個字段很可能會使您的數據庫以毫秒爲單位,因此除非您知道需要每秒處理10或100次更改,否則我不會擔心性能太高。
「更新時間/更新頻率」的答案將更多地取決於方法的內容。假設該方法返回相同的值,除非有關視頻對象的變化,並且沒有外部依賴關係,那麼它將很適合放入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
很酷,你能提供一個回調的例子嗎?我不知道如何處理回調時,方法有參數... – 2011-03-19 19:56:53
更新後的一些代碼,讓你開始。 – ctcherry 2011-03-19 20:00:32
這不是隻能設置rank_sum而不更新嗎? – 2011-03-19 20:11:04
我能想到的兩種選擇:當一個新的投票
我會假設在每次新的投票中更新它可能會對性能產生負面影響?另外,我從未使用過cron。關於如何開始使用它的任何好的資源? – 2011-03-19 19:58:39
我喜歡用[時](https://github.com/javan/whenever)創業板與鐵軌應用 – ctcherry 2011-03-19 20:01:47
crons我不這麼認爲。畢竟,你只是更新一筆款項。一個cron對你來說很容易,更多的信息請看看:http://www.codercaste.com/2009/11/24/how-to-backup-mysql-databases-automatically-using-cron/ – Spyros 2011-03-19 20:03:19
我應該在VideoVote模型中使用'update_rank_sum'回調函數(我的投票是在哪裏處理的)? – 2011-03-19 20:14:21
另外,在這種情況下,'self'是指'Video',對吧? – 2011-03-19 20:15:32
當你需要傳入方法參數時,回調函數並不真正起作用。在我的第一個例子中,數據庫更新是立即進行的。第二,你需要在調用update_rank_sum之後調用保存視頻。是的,'self'指的是方法的接收者,如果你已經在'Video'類中定義了這個方法,'self'就是'Video'實例。 – npad 2011-03-19 20:49:16