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可用的无数据库属性?
谢谢.
废弃所有这些并只定义一个名为的方法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)
| 归档时间: |
|
| 查看次数: |
1996 次 |
| 最近记录: |