class ActiveAdmin::Audit::VersionSnapshot
Public Class Methods
dump(snapshot)
click to toggle source
# File lib/active_admin/audit/version_snapshot.rb, line 4 def self.dump(snapshot) snapshot.to_json end
load(string)
click to toggle source
# File lib/active_admin/audit/version_snapshot.rb, line 8 def self.load(string) self[JSON.parse(string || '{}')] end
Public Instance Methods
diff(other_snapshot)
click to toggle source
# File lib/active_admin/audit/version_snapshot.rb, line 12 def diff(other_snapshot) keys = (self.keys + other_snapshot.keys).uniq keys.each_with_object({}) do |key, diff| old_value = self[key] new_value = other_snapshot[key] if old_value.class == new_value.class item_diff = {} added = new_value - old_value item_diff[:+] = added unless added.empty? removed = old_value - new_value item_diff[:-] = removed unless removed.empty? diff[key] = item_diff unless item_diff.empty? end end end
materialize(klass)
click to toggle source
# File lib/active_admin/audit/version_snapshot.rb, line 33 def materialize(klass) each do |attr, values| self[attr] = if values.is_a? Array # array of any values values.map { |value| materialize_item(klass, attr, value) } elsif values.is_a? Hash # hash with diff in '+'/'-' values.each do |k, items| values[k] = items.map { |value| materialize_item(klass, attr, value) } end else # any values materialize_item(klass, attr, values) end end end
Private Instance Methods
materialize_item(klass, attr, value)
click to toggle source
# File lib/active_admin/audit/version_snapshot.rb, line 53 def materialize_item(klass, attr, value) if (association = klass.reflect_on_all_associations.find { |a| [a.foreign_key, a.plural_name, a.name.to_s].include?(attr) }) # attr is association in klass if value.is_a?(Hash) if value.size == 1 && value.keys.first.to_s == association.klass.primary_key.to_s # has_many/has_one materialize_record_value(association.klass, value.values.first) else # nested item value.each do |key, v| value[key] = materialize_item(association.klass, key, v) end end elsif value.is_a?(Integer) || value =~ /\d+/ # belongs_to materialize_record_value(association.klass, value) end else value end end
materialize_record_value(klass, value)
click to toggle source
# File lib/active_admin/audit/version_snapshot.rb, line 75 def materialize_record_value(klass, value) klass.find_by(id: value) || "#{klass} ##{value} was removed" end