gpt4 book ai didi

ruby-on-rails - ActiveRecord 属性依赖于其他模型的计算

转载 作者:行者123 更新时间:2023-12-04 05:01:47 25 4
gpt4 key购买 nike

这是我的场景:

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 更新当它被创建或更新时。
  • 使用 memcached 或 redis 数据库来缓存该值,并在每次出现 ThingRating 时使缓存失效。被更新或创建。

  • 当然,这些解决方案并不详尽。您可以找到其他更适合您需求的产品。

    关于ruby-on-rails - ActiveRecord 属性依赖于其他模型的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16082077/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com