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
没有附加属性评级。所以,如果我将objecte
传递给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)