考虑模型用户:
User(id: integer, name: string, email: string, status: string)
当我构建应用程序时,status是数据库中的一个字段。但新要求意味着更改,以便在某些情况下动态计算状态。例如,在星期日,如果他们的姓氏以A开头,那么他们的状态是“不正常”。
我想将此功能封装在用户模型中 ,如下所示 :
Class User < ActiveRecord::Base
def status
if is_sunday && last_name.starts_with('A')
return 'not ok'
else
return status
end
end
end
最好的方法是什么?如果上面的代码确实有效,那么使用方法覆盖数据库中的字段似乎是不好的做法。
或者,我可以创建一个方法get_status
来使用上面的代码。但在这种情况下,我需要在整个应用程序中更改status
的每个引用。这听起来不太好。
答案 0 :(得分:4)
我在ActiveRecord::Base documentation中看到,您可以覆盖ActiveRecord提供的默认访问者。当然,你不能像你一样使用status
,因为它会使方法有点递归。
如果您愿意,可以使用read_attribute(:attribute_name)
或self[:attribute_name]
来访问数据库中的列值。长话短说,你的访问者变成了:
Class User < ActiveRecord::Base
def status
if is_sunday && last_name.starts_with('A')
'not ok'
else
read_attribute(:status)
end
end
end
更新:我已经尝试了它并且它可以正常工作但要注意,因为如果你没有明确地调用这个方法,你会得到数据库内容...例如你试图查询{{ 1}}表用于查找users
用户,您可能会有惊喜。