目前,我正在开发一个小型图书评价应用,用户可以在其中对图书进行评价和评论。
我当然有一个书本模型:
class Book < ActiveRecord::Base
has_many :ratings
end
和评级模型:
class Rating < ActiveRecord::Base
belongs_to :book
end
评级对象的“总体评级值”是通过不同的评级类别(例如,可读性,...)来计算的。此外,一本书的整体评分应由所有给定的评分计算得出。
现在我要问自己一个问题:我是否应该每次有人访问我的页面时都计算/查询每本书的总体评分,还是应该在我的图书模型中添加(定期)计算和保存总体评分的字段?
编辑:在这种情况下,我将使用的“计算”是一个简单的平均确定值。
示例:一本书的评分约为200。每个评分由10个类别评分组成。因此,我想确定一个评分的平均值,然后确定所有200个评分的平均值。
如果这些评级的平均值在计算上并不昂贵(即,不需要很长时间),则可以即时进行计算。这与不过早优化的想法保持一致(请参阅http://c2.com/cgi/wiki?PrematureOptimization)。
但是,如果您确实想优化此计算,则可以将其存储在书本模型上,并根据评级写入更新计算。这就是所谓的“缓存”结果。这是一些将平均评分缓存在数据库中的代码。(还有其他缓存方式)。
class Book < ActiveRecord::Base
has_many :ratings, after_add :update_average_rating
def update_average_rating
update_attribute(:average_rating, average_rating)
end
def average_rating
rating_sum / ratings.count
end
def rating_sum
ratings.reduce(0) {|sum, rating|
sum + rating.value # assuming rating model has a value attribute
}
end
end
class Rating < ActiveRecord::Base
belongs_to :book
end
注意:上面的代码假定average_rating
数据库中书表上存在一列。记住要在迁移中添加此列。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句