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')