2011-05-30 53 views
2

我有以下(簡化模型)並希望訪問對象的to_json方法中的「已用」值,理想情況下是對象的屬性。將has_many關係的總和添加到模型的屬性

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

我能找到這個最佳溶液重寫「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 
0

您可以使用:methods參數來調用to_json。

object.to_json(:methods => :spent) 

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

+0

是否沒有辦法將此方法的結果直接添加到屬性中,所以我不必操縱序列化? – beseku 2011-05-30 10:56:37

+0

此外,這種方法不會對集合工作 - Job.to_json:method =>:花費不會產生花費的變量。 – beseku 2011-05-30 11:16:06

相關問題