Ruby on rails 为Rails对象创建临时属性并传递到视图

Ruby on rails 为Rails对象创建临时属性并传递到视图,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个考试模型,它有一个数据库属性score。现在,我想有另一个名为rating的属性,它将此分数转换为评级(A、B、C、D、F)。我不想为评级创建另一列,因此我使用了虚拟属性,如下所示: class Exam < ActiveRecord::Base attr_accessor :rating after_initialize :set_rating after_find :set_rating private def set_r

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

  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
没有附加属性评级。所以,如果我将object
e
传递给Rails视图,我就无法获得
e.rating
,其中rating是一个属性

如何实现我想要的,即在查找后可用的无数据库属性


多谢各位

放弃所有这些,只需定义一个名为
rating
的方法

class Exam < ActiveRecord::Base

  # ...

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

end

问题是,当我通过对象检查以查看时,我就不再有这种方法了。所以你的解决方案对我的案子不起作用。我可以保证你确实有这个方法,而且这个解决方案对你的案例有效。您在类上定义的任何方法都将在视图中可用。您是否将该方法定义为
private
?没有理由这样做,这会使它看起来不响应
评级
。我会创建一个新的评级类,以保持模型干净。请在这里阅读更多内容,例如:@meagar我从你建议的方式开始,但不太记得为什么我不得不放弃它。我想当我需要从客户端返回AJAX调用的AJAX对象时,我遇到了障碍。我不知道如何给它添加一个额外的属性。@Deradon你要创建第二个类来容纳一个5行方法吗?这是一个糟糕的想法,尤其是在这种情况下,该方法的行为明确表示为考试的只读属性。不要那样做。通过引入一百万个愚蠢的5行类,你没有保持任何“干净”。
class Exam < ActiveRecord::Base

  # ...

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

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