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

Ada*_*NYC 2 activerecord ruby-on-rails

我有一个考试模型,它有一个数据库属性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
Run Code Online (Sandbox Code Playgroud)

从我可以打电话的意义上说,这是有效的

e = Exam.find_by_student("John")
e.rating 
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

mea*_*gar 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
Run Code Online (Sandbox Code Playgroud)

如果需要在JSON响应中包含此"属性",则可以将:methods参数传递as_json给显式包含它:

render json: @exam.as_json(members: :rating)
Run Code Online (Sandbox Code Playgroud)

  • @Deradon你会做第二堂课来容纳一个5行方法吗?这是一个糟糕的主意,特别是在这种情况下,该方法明确表示行为类似于考试的只读属性.不要那样做.通过引入一百万个愚蠢的5行类,你不会保持任何"干净". (2认同)