簡體   English   中英

我應該如何更新此數據庫列?

[英]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

我可以想到兩種選擇:

  1. 更新新的投票。 可以的,因為您可以在該字段上建立索引。
  2. 每1個小時左右用cron更新一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM