如何在渲染之前向子关联添加属性?

时间:2010-05-19 03:27:05

标签: ruby-on-rails

我有一个老师模特,有很多学生。当我渲染一个学生(作为json)时,我想删除teacher_id属性并将其替换为我所代表的老师的名字。

实现这一目标的最佳方法是什么?

干杯,

克里斯

2 个答案:

答案 0 :(得分:2)

定义名为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
                                          }
                            }
                )

答案 1 :(得分:0)

您始终可以在模型上重新定义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

请注意,当使用像这样的强力合并时,结果有时不太令人满意,但会用于默认情况。如果指定:methods或:除了您自己的选项外,将忽略默认值。