class PaperTrail::RelatedChanges::BuildChanges
Attributes
item_id[R]
item_type[R]
model_type_children[R]
results[R]
Public Class Methods
new(results, model_type_children, item_type, item_id)
click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 9 def initialize(results, model_type_children, item_type, item_id) @results = results @model_type_children = model_type_children @item_type = item_type @item_id = item_id end
Public Instance Methods
call()
click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 16 def call changes = results.map do |root_version, versions, request_id| versions_serialized = versions_serialized(versions) root_change = change_with_root(request_id, root_version, versions_serialized) root_change.change.children = children_versions(versions_serialized).map(&:change) root_change.change end.compact remove_duplicate_changes(changes) end
Private Instance Methods
attribute_version_changes(versions_serialized)
click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 59 def attribute_version_changes(versions_serialized) versions_serialized.select { |vr| vr.change.merge_into_root }.map(&:change).flat_map(&:diffs) end
change_with_root(request_id, root_version, versions_serialized)
click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 48 def change_with_root(request_id, root_version, versions_serialized) s = Serializer.new(root_version, item_type: root_version.item_type, root_type: item_type) s.change.diffs = [*s.change.diffs, *attribute_version_changes(versions_serialized)] s.change.version_id = request_id || root_version.request_id s end
children_versions(versions_serialized)
click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 55 def children_versions(versions_serialized) versions_serialized.reject { |vr| vr.change.merge_into_root } end
model_to_include_name()
click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 78 def model_to_include_name model_type_children.each_with_object({}) { |(n, r), h| h[r.klass.name] = n } end
remove_duplicate_changes(changes)
click to toggle source
Given a case where a change is represented by a previous change do not show it.
# File lib/paper_trail/related_changes/build_changes.rb, line 30 def remove_duplicate_changes(changes) changes.reject.with_index do |change, index| stop_iteration = false changes[(index + 1)..-1].each do |previous_change| change.diffs = change.diffs.reject do |current_change| next false if stop_iteration previous_matched_change = previous_change .diffs .detect { |previous_change| previous_change.attribute == current_change.attribute } stop_iteration = true if previous_matched_change # As soon as their is match stop previous_matched_change.eql?(current_change) end end change.empty? end end
versions_serialized(versions)
click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 63 def versions_serialized(versions) versions.flat_map do |parent_type, versions_with_child_type| versions_with_child_type.flat_map do |_type, versions_of_child| versions_of_child.map do |version| Serializer.new( version, item_type: parent_type, model_to_include_name: model_to_include_name, root_type: item_type ) end end end end