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

时间:2011-05-30 10:22:24

标签: ruby-on-rails-3 activerecord

我有以下(简化模型)并希望访问对象的to_json方法中的“花费”值,理想情况下是对象的属性。

class Task < ActiveRecord::Base
  has_many    :hours

  def spent
    self.hours.sum(:spent)
  end
end

有没有办法在不定义方法和黑客攻击to_json方法的情况下执行此操作?我一直在寻找一种方法来使用范围或者通过黑客攻击after_initialize方法,但是当在模型上使用inspect或to_json时,这些方法都没有提供“花费”值。

我需要在使用has_many,通过关系的树上的模型上解决这个问题。

2 个答案:

答案 0 :(得分:0)

您可以使用:methods参数来调用to_json。

object.to_json(:methods => :spent)

http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html

答案 1 :(得分:0)

我能找到的最佳解决方案是覆盖'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