我有以下(简化模型)并希望访问对象的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,通过关系的树上的模型上解决这个问题。
答案 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