Guest User

Untitled

a guest
May 21st, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.33 KB | None | 0 0
  1.  
  2. # Extension of the ActiveRecord's Dirty module to enable
  3. # tracking changes even after the record has been saved
  4. # (as ActiveRecord's dirty changes are emptied on save).
  5. #
  6. # User.send :include, DirtyMemento
  7. #
  8. # user = User.find_by_name 'kares'
  9. #
  10. # assert ! user.name_changed?
  11. # assert ! user.name_previously_changed?
  12. # user.name = 'kares7'
  13. # assert user.name_changed?
  14. # assert ! user.name_previously_changed?
  15. # user.save
  16. # assert ! user.name_changed?
  17. # assert user.name_previously_changed?
  18. #
  19. module DirtyMemento
  20.  
  21. def self.included(base)
  22. base.attribute_method_suffix '_previously_changed?', '_was_previously'
  23. base.alias_method_chain :save, :dirty_memento
  24. base.alias_method_chain :save!, :dirty_memento
  25. base.alias_method_chain :update, :dirty_memento
  26. base.alias_method_chain :reload, :dirty_memento
  27. end
  28.  
  29. # Do any attributes have unsaved changes?
  30. # person.previously_changed? # => false
  31. def previously_changed?
  32. ! previously_changed_attributes.empty?
  33. end
  34.  
  35. # List of attributes with unsaved changes.
  36. # person.previously_changed # => ['name']
  37. def previously_changed
  38. previously_changed_attributes.keys
  39. end
  40.  
  41. def save_with_dirty_memento(*args) #:nodoc:
  42. set_previously_changed_attributes
  43. save_without_dirty_memento(*args)
  44. end
  45.  
  46. def save_with_dirty_memento!(*args) #:nodoc:
  47. set_previously_changed_attributes
  48. save_without_dirty_memento!(*args)
  49. end
  50.  
  51. def update_with_dirty_memento(*args) #:nodoc:
  52. set_previously_changed_attributes
  53. update_without_dirty_memento(*args)
  54. end
  55.  
  56. def reload_with_dirty_memento(*args) #:nodoc:
  57. set_previously_changed_attributes
  58. reload_without_dirty_memento(*args)
  59. end
  60.  
  61. private
  62.  
  63. # Map of change attr => original value.
  64. def previously_changed_attributes
  65. @_previously_changed_attributes ||= {}
  66. end
  67.  
  68. def set_previously_changed_attributes
  69. @_previously_changed_attributes = changed_attributes.clone
  70. end
  71.  
  72. # Handle *_previously_changed? for method_missing.
  73. def attribute_previously_changed?(attr)
  74. previously_changed_attributes.include?(attr)
  75. end
  76.  
  77. # Handle *_was_previously for method_missing.
  78. def attribute_was_previously(attr)
  79. attribute_previously_changed?(attr) ? previously_changed_attributes[attr] : __send__(attr)
  80. end
  81.  
  82. end
Add Comment
Please, Sign In to add comment