2012-08-23 61 views
1

我有一個帖子模型,它有很多評分,我想在帖子評分數據列中存儲每篇帖子的平均評分數字。我在帖子模型上有一個計數器緩存,用來計算收視率。創建新評分時更新帖子屬性

我在post.rb

def update_rating 
    if self.ratings_count_changed? 
     self.rating = self.ratings.average(:rating) 
    end 
    end 

我有這個作爲before_save回調所以每當後編輯和保存它更新的收視率,不是很有用下面的代碼。

有沒有一種方法可以在創建新評級時調用此方法?

回答

1

的方法之一是增加after_create回調Rating型號:

class Rating < ActiveRecord::Base 
    belongs_to :post 

    # ... 

    after_create :update_post_average_rating 
    def update_post_average_rating 
    self.post.update_attributes(:rating => self.post.ratings.average(:rating)) 
    end 
end 

甚至更​​多OO友好的版本:

class Post < ActiveRecord::Base 
    has_many :ratings 

    # ... 

    def update_average_rating 
    update_attributes(:rating => self.ratings.average(:rating)) 
    end 
end 

class Rating < ActiveRecord::Base 
    belongs_to :post 

    # ... 

    after_create :update_post_average_rating 
    def update_post_average_rating 
    self.post.update_average_rating 
    end 
end 
+1

嗨,謝爾,這對我來說很合理,但是post.rb update_average_rating似乎沒有設置評分屬性,即使我聲明值爲5而不是ratings.average。事後需要self.update_attribute或self.save嗎? – dodgerogers747

+0

哦,是的,它確實!讓我更新代碼以反映這一點。 –

+0

lol ok !,我設法讓我的工作使用self.post.update_attributes(評分:self.post.ratings.average(:rating)) – dodgerogers747

1

您是否考慮在評級模型中存儲平均評級而不是發佈模型?在這種情況下,您不需要任何回調,並且您需要在更改之後通過第一次請求進行平均值重新計算。

1

取而代之的是before_save在帖子上做一個after_create的評級,因爲它聽起來像你需要更新評分時創建一個新的評分,而不是保存該帖子之前。越來越接近你的目標的

1

如何把這個放入評級模型:

after_create :update_post_average_rating 

def update_post_average_rating 
    self.post.rating = #.... 
end 
+0

嗨埃雷茲,這似乎非常接近ty,但self.post.rating =從未似乎設置後評級屬性。我想知道可以完成這種類型的聲明嗎? – dodgerogers747