为Rails对象创建临时属性并传递给View

时间:2013-04-15 16:13:44

标签: ruby-on-rails activerecord

我有一个考试模型,它有一个数据库属性score。现在,我想要另一个名为rating的属性,它将此分数转换为等级(A,B,C,D,F)。我不想为rating创建另一列,所以我使用了虚拟属性如下:

  class Exam < ActiveRecord::Base
     attr_accessor :rating
     after_initialize :set_rating
     after_find :set_rating

     private
     def set_rating
        self.rating = case score
          when 0..49 then "F"
          when 50..79 then "B"
          else "A" 
     end
 end

这是有效的,我可以打电话

e = Exam.find_by_student("John")
e.rating 

但是,对象e没有附加属性评级。因此,如果我将对象e传递给Rails视图,我就无法获得e.rating,其中rating是属性。

我如何实现我想要的,即after_find可用的无数据库属性?

谢谢。

1 个答案:

答案 0 :(得分:7)

废弃所有这些并只定义一个名为rating的方法。

class Exam < ActiveRecord::Base

  # ...

  def rating
    case score
      when 0..49 then "F"
      when 50..79 then "B"
      else "A" 
    end
  end

end

如果您需要在JSON响应中包含此“属性”,则可以将:methods参数传递给as_json以明确包含它:

render json: @exam.as_json(members: :rating)