[英]How should I update this database column?
所以我在視頻模型中有一個方法:
def rank_sum(score, video)
...
...
end
返回一個值,該值我要存儲在rank_sum
列中特定視頻的數據庫中。
我還訂購視頻,如下所示:
default_scope order('videos.rank_sum')
現在我的問題是我應該如何更新rank_sum
列? 有回調嗎? 我應該多久更新一次?
我建議您不要創建與模型的任何自動創建的屬性發生沖突的方法,因為這會干擾內置的Rails功能(例如表單生成)。
您可以簡單地重寫您的方法,如下所示:
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
每次調用update_rank_sum
方法時,這將更新數據庫中的值(如果需要)。
如果您想將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
但是請記住,您將需要在Video
實例上調用save
以將更改持久save
到數據庫。
更新單行的一個字段可能會使您的數據庫花費毫秒級的時間,因此除非您知道每秒需要處理10或100秒鍾的更改,否則我不必擔心性能。
更新“何時/多久一次”的答案將更多地取決於rank_sum
方法的內容。 假設該方法返回相同的值,除非有關Video對象的某些事情發生了變化,並且沒有外部依賴關系,那么將其放置在before_save
回調中是一個很好的選擇。 但是,如果rank_sum
方法具有外部依賴關系(例如,可能從評級表中讀取),那么您將需要多長時間一次(可能或多或少地)更新數據庫中的該值,這將更多地是一個“業務決策”比before_save
回調會觸發它。
更新
一個例子:
before_save :set_rank_sum
private
def set_rank_sum
self.rank_sum = rank_sum(value1, value2)
end
我可以想到兩種選擇:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.