2011-03-19 64 views
1

所以我在我的视频模型的方法:我应该如何更新这个数据库列?

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

返回,我想在我的数据库存储在rank_sum列中的特定影片的值。

我也是为了我的视频,像这样:

default_scope order('videos.rank_sum') 

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

回答

1

我建议您不要创建与模型的任何自动创建的属性冲突的方法,因为这会干扰内置的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 

但请记住,你将需要调用saveVideo实例坚持对数据库的更改。

更新单个行的一个字段很可能会使您的数据库以毫秒为单位,因此除非您知道需要每秒处理10或100次更改,否则我不会担心性能太高。

+0

我应该在VideoVote模型中使用'update_rank_sum'回调函数(我的投票是在哪里处理的)? – 2011-03-19 20:14:21

+0

另外,在这种情况下,'self'是指'Video',对吧? – 2011-03-19 20:15:32

+0

当你需要传入方法参数时,回调函数并不真正起作用。在我的第一个例子中,数据库更新是立即进行的。第二,你需要在调用update_rank_sum之后调用保存视频。是的,'self'指的是方法的接收者,如果你已经在'Video'类中定义了这个方法,'self'就是'Video'实例。 – npad 2011-03-19 20:49:16

0

“更新时间/更新频率”的答案将更多地取决于方法的内容。假设该方法返回相同的值,除非有关视频对象的变化,并且没有外部依赖关系,那么它将很适合放入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 
+0

很酷,你能提供一个回调的例子吗?我不知道如何处理回调时,方法有参数... – 2011-03-19 19:56:53

+0

更新后的一些代码,让你开始。 – ctcherry 2011-03-19 20:00:32

+0

这不是只能设置rank_sum而不更新吗? – 2011-03-19 20:11:04

0

我能想到的两种选择:当一个新的投票

  1. 更新。这可能是好的,因为你可以在这个字段上有一个索引。
  2. 每1小时左右更新一次cron。
+0

我会假设在每次新的投票中更新它可能会对性能产生负面影响?另外,我从未使用过cron。关于如何开始使用它的任何好的资源? – 2011-03-19 19:58:39

+0

我喜欢用[时](https://github.com/javan/whenever)创业板与铁轨应用 – ctcherry 2011-03-19 20:01:47

+0

crons我不这么认为。毕竟,你只是更新一笔款项。一个cron对你来说很容易,更多的信息请看看:http://www.codercaste.com/2009/11/24/how-to-backup-mysql-databases-automatically-using-cron/ – Spyros 2011-03-19 20:03:19