【问题标题】:How to get the original value of an attribute in Rails如何在 Rails 中获取属性的原始值
【发布时间】:2009-09-28 15:03:20
【问题描述】:

有没有办法获取 ActiveRecord 属性的原始值(=从数据库加载的值)?

我想在观察者身上看到这样的东西

before_save object
  do_something_with object.original_name
end

任务是在更新时从哈希表中删除对象(实际上是将其移动到表中的另一个键)。

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    在轨道 5.1 之前

    _was 附加到您的属性将为您提供之前的值。

    适用于轨道 5.1+

    复制自 Lucas Andrade 下面的回答https://stackoverflow.com/a/50973808/9359123


    附加 _was 在 Rails 5.1 中已弃用,现在您应该附加 _before_last_save

    类似:

    before_save object
      do_something_with object.name_before_last_save
    end
    

    将在您上次保存到数据库之前返回名称值(适用于保存和创建)


    _was_before_last_save的区别根据文档:

    _was来源from docs

    def attribute_was(attr)
      attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
    end
    

    _before_last_save来源from docs

    def attribute_before_last_save(attr_name)
      mutations_before_last_save.original_value(attr_name)
    end
    

    【讨论】:

    • 例如:self.contextself.context_was
    • 这方面的文档在哪里?
    • 在文档中,_was 没有“弃用”警告。
    • 可怜的卢卡斯他的答案被盗了,当前的 SO 是按最多投票排序的,所以我们可以开始点赞卢卡斯的而不是复制
    【解决方案2】:

    适用于轨道 5.1+

    附加 _was 在 Rails 5.1 中已弃用,现在您应该附加 _before_last_save

    类似:

    before_save object
      do_something_with object.name_before_last_save
    end
    

    将在您上次保存到数据库之前返回名称值(适用于保存和创建)


    _was_before_last_save的区别根据文档:

    _was来源from docs

    def attribute_was(attr)
      attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
    end
    

    _before_last_save来源from docs

    def attribute_before_last_save(attr_name)
      mutations_before_last_save.original_value(attr_name)
    end
    

    你可以看到一个更好的例子here

    【讨论】:

    【解决方案3】:

    ActiveRecord 的 attributes_before_type_cast 方法在类型转换和反序列化发生之前返回属性的哈希值。

    【讨论】:

      【解决方案4】:

      查看 Rails 文档

      http://api.rubyonrails.org/classes/ActiveModel/Dirty.html

      Model.attribute_was 返回之前的值:D

      【讨论】:

      • _还在 Rails 5.2.x 中
      猜你喜欢
      • 2021-03-19
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 2013-06-11
      相关资源
      最近更新 更多