ActiveRecord访问者点(。)与括号([])

时间:2016-11-23 12:54:04

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-5

使用Active Record,我们可以访问类似

的值

方法访问

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

哈希访问

user[:name] #=> 'John'

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

2 个答案:

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

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

另一种情况是,让我说我有一个曾经存储在数据库中的属性,但过了一段时间后决定它应该在运行中计算,并最终删除数据库列。使用方法版本我需要做的就是为我的模型添加方法。使用[]表示法将会更加困难。

同样[]提供了微不足道的性能提升,所以尽管它看起来更接近"原始数据确实不是。