2

我有一个考试模型,它有一个数据库属性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评级是一个属性的位置。

我怎样才能实现我想要的,即 after_find 可用的无数据库属性?

谢谢你。

4

1 回答 1

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)
于 2013-04-15T16:16:34.947 回答