将has_many关系的总和添加到模型的属性

问题描述

|| 我有以下示例(简化的模型),并希望在对象的to_json方法中访问\'spent \'值,理想情况下作为对象的属性
class Task < ActiveRecord::Base
  has_many    :hours

  def spent
    self.hours.sum(:spent)
  end
end
有没有一种方法,而无需定义方法修改to_json方法呢?我一直在寻找一种使用范围的方法或通过破解after_initialize方法,但是当在模型上使用inspect或to_json时,这些方法都没有提供“花费”的值。 我也需要通过关系在使用has_many的树的更高模型上解决此问题。     

解决方法

        您可以使用
:methods
参数进行to_json调用。
object.to_json(:methods => :spent)
http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html     ,        我能找到的最佳解决方案是重写\'as_json \'方法以包括我需要的属性或执行所需的逻辑(在这种情况下,has_many关系的总和)。
class Task < ActiveRecord::Base

...

  def as_json(options = { })
    options = {} if options.nil?

    self[:job_id] = self.phase.job_id
    self[:spent] = self.hours.sum(:spent)

    super(options)
  end
end