我该如何更新此数据库列?

时间:2011-03-19 19:50:19

标签: ruby-on-rails ruby ruby-on-rails-3

所以我的视频模型中有一个方法:

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

返回我想要存储在rank_sum列中特定视频的数据库中的值。

我也像这样订购我的视频:

default_scope order('videos.rank_sum')

现在我的问题是我应该如何更新rank_sum列?有回调吗?我应该多久更新一次?

3 个答案:

答案 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)

我可以想到两个选择:

  1. 新投票时更新。这可能没关系,因为你可以在这个领域有一个索引。
  2. 每隔1小时用cron更新一次。