【问题标题】:ActiveRecord accessor dot(.) vs bracket([])ActiveRecord 访问器点(。)与括号([])
【发布时间】:2016-11-23 12:54:03
【问题描述】:

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

方法访问

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

哈希访问

user[:name] #=> 'John'

我只是想知道什么时候使用哪个,或者有什么最佳实践吗? 我个人更喜欢method access,因为我觉得这更像是红宝石方式。但是当我看到别人的代码时,我面对的是hash access

【问题讨论】:

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


    【解决方案1】:

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

    返回其后由attr_name标识的属性的值 已被类型转换(例如,日期列中的 “2004-12-12” 被转换 到日期对象,例如Date.new(2004, 12, 12))。它提出了 ActiveModel::MissingAttributeError 如果标识的属性是 不见了。

    【讨论】:

    • 感谢您的回答。所以你的意思是每当我使用#[] 访问时,都会根据列类型进行一些类型转换。如果我没有指定attr_name,则会引发错误。
    • @Toshi 我已经对答案进行了一些编辑。基本上两种方法是可以互换的,只是约定建议第一种:)
    • 好的,现在我明白了。我只是想知道在任何情况下#[] 会比点符号更好。也许是可读性或其他什么?
    • 不同之处在于,例如,如果您在对象上调用不存在的方法,点表示法会引发异常 undefined method,而 [:] 只会返回 nil(无异常) .我个人的偏好是在点符号之后,尤其是因为可读性:)
    • 谢谢你的回答:)
    【解决方案2】:

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

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

    def name "Awesome #{super}!" end

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-02-05
      相关资源
      最近更新 更多