class PaperTrailHashDiff

Allows storing only incremental changes in the object_changes column Uses HashDiff (github.com/liufengyun/hashdiff)

Attributes

only_objects[R]

Public Class Methods

new(only_objects: false) click to toggle source
# File lib/paper_trail_hashdiff.rb, line 8
def initialize(only_objects: false)
  @only_objects = only_objects
end

Public Instance Methods

diff(changes) click to toggle source
# File lib/paper_trail_hashdiff.rb, line 12
def diff(changes)
  diff_changes = {}
  changes.each do |field, value_changes|
    diff_changes[field] =
      if !only_objects || (
        value_changes[0] && value_changes[1] &&
        (value_changes[0].is_a?(Hash) || value_changes[0].is_a?(Array))
      )
        Hashdiff.diff(value_changes[0], value_changes[1], array_path: true, use_lcs: false)
      else
        value_changes
      end
  end
  diff_changes
end
load_changeset(version) click to toggle source
# File lib/paper_trail_hashdiff.rb, line 36
def load_changeset(version)
  HashWithIndifferentAccess.new(version.object_changes_deserialized)
end
where_object_changes(version_model_class, attributes) click to toggle source
# File lib/paper_trail_hashdiff.rb, line 28
def where_object_changes(version_model_class, attributes)
  scope = version_model_class
  attributes.each do |k, v|
    scope = scope.where('(((object_changes -> ?)::jsonb ->> 0)::jsonb @> ?)', k.to_s, v.to_s)
  end
  scope
end