我有一个考试模型,它有一个数据库属性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可用的无数据库属性?
谢谢。
答案 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)