How to get the original value of an attribute in Rails

前端 未结 4 1294
一生所求
一生所求 2020-12-23 20:17

is there a way to get the original value that an ActiveRecord attribute (=the value that was loaded from the database)?

I want something like this in an observer

相关标签:
4条回答
  • 2020-12-23 20:37

    For rails 5.1+

    Appending _was is deprecated in rails 5.1, now you should append _before_last_save

    Something like:

    before_save object
      do_something_with object.name_before_last_save
    end
    

    Will return the name value before your last save at database (works for save and create)


    The difference between _was and _before_last_save according to the documentation:

    _was source from docs

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

    _before_last_save source from docs

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

    You can see a better example here

    0 讨论(0)
  • 2020-12-23 20:43

    ActiveRecord's attributes_before_type_cast method returns a hash of attributes before typecasting and deserialization have occurred.

    0 讨论(0)
  • 2020-12-23 20:49

    Take a look in rails documentation

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

    Model.attribute_was return previous value :D

    0 讨论(0)
  • 2020-12-23 20:53

    Before rails 5.1

    Appending _was to your attribute will give you the previous value.

    For rails 5.1+

    Copied from Lucas Andrade's answer below: https://stackoverflow.com/a/50973808/9359123


    Appending _was is deprecated in rails 5.1, now you should append _before_last_save

    Something like:

    before_save object
      do_something_with object.name_before_last_save
    end
    

    Will return the name value before your last save at database (works for save and create)


    The difference between _was and _before_last_save according to the documentation:

    _was source from docs

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

    _before_last_save source from docs

    def attribute_before_last_save(attr_name)
      mutations_before_last_save.original_value(attr_name)
    end
    
    0 讨论(0)
提交回复
热议问题