【问题标题】:Rails, activerecord: self[:attribute] vs self.attributeRails,activerecord:self[:attribute] vs self.attribute
【发布时间】:2014-08-15 17:02:45
【问题描述】:

在 Rails 中访问活动记录列/属性时,使用 self[:attribute] 与 self.attribute 有什么区别?这会影响 getter 和 setter 吗?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    它们都是获取属性的方法——它们都是getter。 self.attribtue 是一个更“传统”的 getter,而 self[:attribute] 基本上只是 [] 方法。在使用两者之间切换没有任何后果。

    我建议只使用self.attribute 方法,因为它在语法上更好。但是,当其他东西覆盖self.attribute 方法时,使用self[:attribute] 会派上用场。

    例如,假设您有一个带有name 数据库列的用户模型,那么您将得到user.name。但是,假设您安装了一个 gem,它为每个模型添加了 #name 方法。为避免复杂性,一种选择是使用user[:name] 直接访问它,而无需通过受感染的方法。

    【讨论】:

    • 昨天刚刚咬了我一口。 Frank Koehl 的答案是正确的。
    【解决方案2】:

    接受的答案遗漏了一个关键区别。如果您尝试在设置值的同时修改属性,那么您必须使用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')
    

    【讨论】:

      猜你喜欢
      • 2010-12-24
      • 2018-01-23
      • 2010-12-12
      • 2023-03-16
      • 1970-01-01
      • 2014-04-04
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多