2012-02-07 72 views
0

我有一个名为投票模型,这是什么vote.rb样子:在修改另一个模型(Rails)列的模型中使用回调?

class Vote < ActiveRecord::Base 
    belongs_to :votable, :polymorphic => true 
    belongs_to :user 

    before_create :update_total 

    protected 

    def update_total 
    self.total ||= 0 
    self.total += self.polarity 
    end 
end 

(这是多态的,因为它也属于所谓的评论另一个模型)。

每次投票创建时,总价值都会更新。例如,Vote.create(:polarity => 2),会产生:polarity => 2, :total => 2

我才意识到,这是没有意义的,因为:polarity永远等于:total。我真正想要做的是让total的模型投票属于;在这种情况下邮政评论投票属于发布和有很多票),使每一个投票创建时间,在后total列将被更新。就像这样:

5月13日

Post.total = 3 (:id => 2) 

Vote.polarity = 1 (:id => 1) 
Vote.polarity = -1 (:id => 2) 
Vote.polarity = 3 (:id => 3) 

5月14日

Post.total = 4 (:id => 2) 

Vote.polarity = 1 (:id => 1) 
Vote.polarity = -1 (:id => 2) 
Vote.polarity = 3 (:id => 3) 
Vote.polarity = 1 (:id => 4) 

回答

2

您需要更新以这种方式总的可投票对象:

def update_total 
    if self.votable.class.column_names.include?("total") 
    total_average = self.votable.total ||= 0 
    self.votable.update_attribute(:total, total_average + self.polarity) 
    end 
end 

,或者您可以使用有条件的回调像@Sandip说:

before_create :update_total, :if => defined_total 

def defined_total 
    self.votable.class.column_names.include?("total") 
end 

def update_total 
    total_average = self.votable.total ||= 0 
    self.votable.update_attribute(:total, total_average + self.polarity) 
end 
+0

对不起,这可能是一个愚蠢的问题,但我必须为Post和Comment模型创建'total'列首先正确吗? – alexchenco 2012-02-07 08:10:42

+2

是的,你需要为你使用的所有可投票模型创建总列数 – 2012-02-07 08:15:20

+0

不一定你总是可以检查“total”是否被定义,如果你只是特意需要'post'投票。 before_create:update_total,:if =>“self.votable.defined?(:total)” – 2012-02-07 11:35:58

相关问题