Как добавить свойство в дочернюю ассоциацию перед рендерингом? - PullRequest
1 голос
/ 19 мая 2010

У меня есть модель учителя, которая имеет множество учеников. Когда я отображаю ученика (как json), я хочу удалить свойство teacher_id и заменить его именем учителя в моем представлении.

Каков наилучший способ достичь этого?

Приветствия

Chris

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

Определите метод с именем teacher_name.

class Student < ActiveRecord::Base
  def teacher_name
    self.teacher.name
  end
end

Включите метод teacher_name при вызове to_json:

teacher.to_json(:include => {:students => {:methods=> :teacher_name, 
                                           :except => :teacher_id
                                          }
                            }
                )
0 голосов
/ 19 мая 2010

Вы всегда можете переопределить метод to_json в модели, чтобы сделать все, что вы хотите:

class Student < ActiveRecord::Base
  def to_json
    self.attributes.merge(
      'teacher_id' => self.teacher.name
    ).to_json
  end
end

Обновление: На основе отзывов от kandadaboggu , с использованием другого подхода:

class Student < ActiveRecord::Base
  def teacher_name
    self.teacher and self.teacher.name
  end

  def to_json(options = { })
    super(
      {
        :methods => :teacher_name,
        :except => :teacher_id)
      }.merge(options)
    )
  end
end

Обратите внимание, что при таком грубом слиянии результат иногда оказывается менее чем удовлетворительным, но будет служить для случая по умолчанию. Если вы укажете: методы или: кроме ваших собственных параметров, значения по умолчанию будут игнорироваться.

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