所以我的视频模型中有一个方法:
def rank_sum(score, video)
...
...
end
返回我想要存储在rank_sum
列中特定视频的数据库中的值。
我也像这样订购我的视频:
default_scope order('videos.rank_sum')
现在我的问题是我应该如何更新rank_sum
列?有回调吗?我应该多久更新一次?
答案 0 :(得分:1)
我建议您不要创建与模型的任何自动创建的属性冲突的方法,因为这会干扰内置的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
但请记住,您需要在save
实例上调用Video
来保持对数据库的更改。
更新单行的一个字段可能会使您的数据库按毫秒级排列,因此我不会过分担心性能,除非您知道每秒需要处理10或100次更改。
答案 1 :(得分:0)
更新“何时/多久”的答案更多地取决于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
答案 2 :(得分:0)
我可以想到两个选择: