Module: VestalVersions::Changes::HashMethods

Defined in:
lib/vestal_versions/changes.rb

Overview

Instance methods included into Hash for dealing with manipulation of hashes in the specific format of ActiveRecord::Base#changes.

Instance Method Summary collapse

Instance Method Details

#append_changes(changes) ⇒ Object

When called on a hash of changes and given a second hash of changes as an argument, append_changes will run the second hash on top of the first, updating the last element of each array value with its own, or creating its own key/value pair for missing keys. Resulting non-unique array values are removed.

Example

first =

"first_name" => ["Steve", "Stephen"],
"age" => [25, 26]

second =

"first_name" => ["Stephen", "Steve"],
"last_name" => ["Richert", "Jobs"],
"age" => [26, 54]

first.append_changes(second) # =>

"last_name" => ["Richert", "Jobs"],
"age" => [25, 54]



87
88
89
90
91
92
93
94
# File 'lib/vestal_versions/changes.rb', line 87

def append_changes(changes)
  changes.inject(self) do |new_changes, (attribute, change)|
    new_change = [new_changes.fetch(attribute, change).first, change.last]
    new_changes.merge(attribute => new_change)
  end.reject do |attribute, change|
    change.first == change.last
  end
end

#append_changes!(changes) ⇒ Object

Destructively appends a given hash of changes onto an existing hash of changes.



97
98
99
# File 'lib/vestal_versions/changes.rb', line 97

def append_changes!(changes)
  replace(append_changes(changes))
end

#prepend_changes(changes) ⇒ Object

Appends the existing hash of changes onto a given hash of changes. Relates to the append_changes method in the same way that Hash#reverse_merge relates to Hash#merge.



104
105
106
# File 'lib/vestal_versions/changes.rb', line 104

def prepend_changes(changes)
  changes.append_changes(self)
end

#prepend_changes!(changes) ⇒ Object

Destructively prepends a given hash of changes onto an existing hash of changes.



109
110
111
# File 'lib/vestal_versions/changes.rb', line 109

def prepend_changes!(changes)
  replace(prepend_changes(changes))
end

#reverse_changesObject

Reverses the array values of a hash of changes. Useful for reversion both backward and forward through a record’s history of changes.



115
116
117
# File 'lib/vestal_versions/changes.rb', line 115

def reverse_changes
  inject({}){|nc,(a,c)| nc.merge!(a => c.reverse) }
end

#reverse_changes!Object

Destructively reverses the array values of a hash of changes.



120
121
122
# File 'lib/vestal_versions/changes.rb', line 120

def reverse_changes!
  replace(reverse_changes)
end