问题描述
||
我有以下示例(简化的模型),并希望在对象的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