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