From aa53c4e69777565ab5fcd5dceac714108546b907 Mon Sep 17 00:00:00 2001 From: Thorsten Eckel Date: Thu, 27 Apr 2017 10:46:49 +0200 Subject: [PATCH] Improved association change tracking for broader use cases. --- lib/import/base_resource.rb | 28 +++++++++++++++++++++++----- lib/import/ldap/user.rb | 2 +- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/import/base_resource.rb b/lib/import/base_resource.rb index 1072a918e..08fc7c245 100644 --- a/lib/import/base_resource.rb +++ b/lib/import/base_resource.rb @@ -6,7 +6,10 @@ module Import def initialize(resource, *args) handle_args(resource, *args) + initialize_associations_states import(resource, *args) + return if @resource.blank? + store_associations(:after, @resource) end def import_class @@ -30,8 +33,7 @@ module Import end def attributes_changed? - return true if changed_attributes.present? - @associations_init != associations_state(@resource) + changed_attributes.present? || changed_associations.present? end def changed_attributes @@ -42,6 +44,15 @@ module Import @resource.previous_changes end + def changed_associations + changes = {} + tracked_associations.each do |association| + next if @associations[:before][association] == @associations[:after][association] + changes[association] = [@associations[:before][association], @associations[:after][association]] + end + changes + end + def created? return false if @resource.blank? # dry run @@ -52,6 +63,13 @@ module Import private + def initialize_associations_states + @associations = {} + %i(before after).each do |state| + @associations[state] ||= {} + end + end + def import(resource, *args) create_or_update(map(resource, *args), *args) rescue => e @@ -96,13 +114,13 @@ module Import return if !synced_instance instance = import_class.find_by(id: synced_instance.o_id) - store_associations_state(instance) + store_associations(:before, instance) instance end - def store_associations_state(instance) - @associations_init = associations_state(instance) + def store_associations(state, instance) + @associations[state] = associations_state(instance) end def associations_state(instance) diff --git a/lib/import/ldap/user.rb b/lib/import/ldap/user.rb index 26525b449..7d2376ed7 100644 --- a/lib/import/ldap/user.rb +++ b/lib/import/ldap/user.rb @@ -94,7 +94,7 @@ module Import remote: resource, ) - store_associations_state(instance) + store_associations(:before, instance) end instance