Добавление суммы отношения has_many к атрибутам модели - PullRequest
2 голосов
/ 30 мая 2011

У меня есть следующее (упрощенная модель) и я хочу получить доступ к «потраченному» значению в методе 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 голосов
/ 31 мая 2011

Лучшее решение, которое я смог найти, это переопределение метода 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 голосов
/ 30 мая 2011

Вы можете использовать параметр :methods для вызова to_json.

object.to_json(:methods => :spent)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...