【发布时间】:2014-08-15 17:02:45
【问题描述】:
在 Rails 中访问活动记录列/属性时,使用 self[:attribute] 与 self.attribute 有什么区别?这会影响 getter 和 setter 吗?
【问题讨论】:
标签: ruby-on-rails ruby activerecord
在 Rails 中访问活动记录列/属性时,使用 self[:attribute] 与 self.attribute 有什么区别?这会影响 getter 和 setter 吗?
【问题讨论】:
标签: ruby-on-rails ruby activerecord
它们都是获取属性的方法——它们都是getter。 self.attribtue 是一个更“传统”的 getter,而 self[:attribute] 基本上只是 [] 方法。在使用两者之间切换没有任何后果。
我建议只使用self.attribute 方法,因为它在语法上更好。但是,当其他东西覆盖self.attribute 方法时,使用self[:attribute] 会派上用场。
例如,假设您有一个带有name 数据库列的用户模型,那么您将得到user.name。但是,假设您安装了一个 gem,它为每个模型添加了 #name 方法。为避免复杂性,一种选择是使用user[:name] 直接访问它,而无需通过受感染的方法。
【讨论】:
接受的答案遗漏了一个关键区别。如果您尝试在设置值的同时修改属性,那么您必须使用self[:attribute]。
例如...
def some_attr=(val)
self.some_attr = val.downcase # winds up calling itself
end
这行不通,因为它是自引用的(你会得到“堆栈太深” 错误)。相反,您必须通过执行来分配值...
def some_attr=(val)
self[:some_attr] = val.downcase
end
还有一个命名方法write_attribute,它执行与self[:attribute] 相同的操作。两者都可以满足您的需求,这是编码风格和个人喜好的问题。我喜欢write_attribute,因为我实际定义的属性是可变的,例如
write_attribute(var, 'some value')
【讨论】: