这是我的场景:
class User < ActiveRecord::Base
has_many :things
# attr_accessible :average_rating
end
class Thing < ActiveRecord::Base
belongs_to :user
has_one :thing_rating
end
class ThingRating < ActiveRecord::Base
belongs_to :thing
attr_accessible :rating
end
我想在我的 User 模型中有一个属性,它具有他相关 ThingsRating 的平均计算。
管理此问题的最佳做法是什么?
谢谢
最佳答案
简单的方法:
class User < ActiveRecord::Base
has_many :things
def avg_rating
@avg_rating ||= average(things.map(&:thing_rating))
end
private
def average(values)
values.inject(0.0) { |sum, el| sum + el } / arr.size
end
end
作为入门,这很好。但是,如果您有一些流量,您可能会发现自己遇到了扩展问题。
然后,您必须重构它以避免每次为不同用户调用该方法时对事物进行 SQL 查询。
然后你可以有几种可能性:
avg_rating
,将由 ThingRating
更新当它被创建或更新时。 ThingRating
时使缓存失效。被更新或创建。 当然,这些解决方案并不详尽。您可以找到其他更适合您需求的产品。
关于ruby-on-rails - ActiveRecord 属性依赖于其他模型的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16082077/