Rails,activerecord:self [:attribute] vs self.attribute

时间:2014-08-15 17:02:46

标签: ruby-on-rails ruby activerecord

在rails中访问活动记录列/属性时,使用self [:attribute]和self.attribute有什么区别?这会影响getter和setter吗?

2 个答案:

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