ActiveRecord accessor dot(.) vs bracket([])



使用活动记录,我们可以访问类似

方法访问

user = User.find(1)
user.name #=> 'John'

哈希访问

user[:name] #=> 'John'

我只是想知道何时使用哪个,或者是否有任何最佳实践? 就我个人而言,我更喜欢method access因为我觉得这更像是红宝石的方式。但是,当我看到其他人的代码时,我面临着hash access.

Rails 约定是使用 ActiveRecord::AttributeMethods::Read#read_attribute(点表示法),而不是其别名 ActiveRecord::AttributeMethods#[],它:

返回由后面的attr_name标识的属性的值 已进行类型转换(例如,日期列中的“2004-12-12”已强制转换 到日期对象,如Date.new(2004, 12, 12))。它提高了ActiveModel::MissingAttributeError标识的属性是否为 失踪。

我强烈建议不要使用括号表示法,因为它会破坏方法调用的继承层次结构并使重构更加困难。

如果我的模型有一个属性name,并且我决定每次有人阅读它时都要增强名称,那么一种非常惯用的方法是:

def name "Awesome #{super}!" end

我的应用程序中任何使用方法版本的地方都可以正常工作,任何使用[]表示法的地方都会返回原始数据库数据。我可以覆盖[],但随后我需要特殊条件检查特定属性。整件事将是一场噩梦。

另一种情况是,假设我有一个曾经存储在数据库中的属性,但过了一段时间,决定应该动态计算它,并最终删除数据库列。使用方法版本,我需要做的就是将方法添加到我的模型中。使用[]符号,该过程将更加困难。

此外,[]提供了微不足道的性能改进,因此尽管看起来它"更接近"原始数据,但实际上并非如此。

最新更新