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

标签 ruby-on-rails ruby-on-rails-3 activerecord

这是我的场景:

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/

    相关文章:

    ruby-on-rails - 在 Rails 模型中进行正则表达式搜索的惯用方法?

    ruby-on-rails - 没有 InnoDB,Rails 3 不能在 MySQL MyISAM 模式下运行吗?

    ruby-on-rails-3 - Rails - 循环卷发请求占用内存

    ruby - 如何将此 Controller 代码移动到 Resque 作业?

    ruby-on-rails - 在 rails/activerecord 中准备好的语句

    ruby-on-rails - 在创建时使用 set_callback 进行 after_commit

    mysql - 从数据库中选择多个计数

    javascript - 将用户创建的 javascript 保存在数据库中是否安全?

    ruby-on-rails - ActiveRecord::StatementInvalid(找不到表)

    ruby-on-rails - 什么时候在 ROR 中声明回调方法 Private 或 Protected?