在rails中访问活动记录列/属性时,使用self [:attribute]和self.attribute有什么区别?这会影响getter和setter吗?
答案 0 :(得分:10)
他们只是获取属性的方法 - 他们只是获取者。 self.attribtue
是一个更传统的传统" getter,而self[:attribute]
基本上只是[]
方法。在使用之间切换没有任何后果。
我建议只使用self.attribute
方法,因为它的语法更好。但是,当其他内容覆盖self[:attribute]
方法时,使用self.attribute
可以派上用场。
例如,假设您的用户模型包含name
数据库列,那么您将获得user.name
。但是,让我们假设您安装了一个为每个模型添加#name
方法的gem。为避免复杂化,一种选择是使用user[:name]
直接访问它,而无需通过受损方法。
答案 1 :(得分:5)
接受的答案错过了一个关键的区别。如果您在设置值时尝试修改属性,则必须使用self[:attribute]
。
例如......
def some_attr=(val)
self.some_attr = val.downcase # winds up calling itself
end
这不起作用,因为它是自引用的(你会得到一个“Stack太深” 错误)。相反,您必须通过执行...
来分配值def some_attr=(val)
self[:some_attr] = val.downcase
end
还有一个命名方法write_attribute
,它执行与self[:attribute]
相同的操作。两者都做你需要的,这是编码风格和个人偏好的问题。当我实际定义的属性是可变的时,我喜欢write_attribute
,例如
write_attribute(var, 'some value')