使用Active Record,我们可以访问类似
的值user = User.find(1)
user.name #=> 'John'
或
user[:name] #=> 'John'
我只是想知道何时使用哪种,或者是否有最佳实践?
我个人更喜欢method access
,因为我觉得这更像是红宝石。但是,当我看到其他人的代码时,我会面对hash access
。
答案 0 :(得分:5)
Rails惯例是使用ActiveRecord::AttributeMethods::Read#read_attribute
(点表示法),而不是别名ActiveRecord::AttributeMethods#[]
,其中:
返回
attr_name
之后标识的属性的值 已进行类型转换(例如,在日期列中投射“2004-12-12”
到日期对象,如Date.new(2004, 12, 12)
)。它提出来了ActiveModel::MissingAttributeError
如果标识的属性是。{ 丢失。
答案 1 :(得分:1)
我强烈建议不要使用括号表示法,因为它会破坏方法调用的继承层次结构并使重构变得更难。
如果我的模型有一个属性name
,并且我决定每次有人阅读时都要增强名称,那么这样做的一个非常惯用的方法是:
def name
"Awesome #{super}!"
end
我的应用中使用方法版本的任何地方都可以正常工作,任何使用[]
表示法的地方都会返回原始数据库数据。我可以覆盖[]
但是我需要特殊条件检查特定属性。整件事情将是一场噩梦。
另一种情况是,让我说我有一个曾经存储在数据库中的属性,但过了一段时间后决定它应该在运行中计算,并最终删除数据库列。使用方法版本我需要做的就是为我的模型添加方法。使用[]
表示法将会更加困难。
同样[]
提供了微不足道的性能提升,所以尽管它看起来更接近"原始数据确实不是。