Class: Harmonize::Strategies::BasicCrudStrategy

Inherits:
Strategy
  • Object
show all
Defined in:
lib/harmonize/strategies/basic_crud_strategy.rb

Instance Attribute Summary

Attributes inherited from Strategy

#harmonize_log, #harmonizer, #sources, #targets

Instance Method Summary collapse

Methods inherited from Strategy

#harmonize, #initialize

Constructor Details

This class inherits a constructor from Harmonize::Strategies::Strategy

Instance Method Details

#create_and_update_targetsObject



41
42
43
44
45
46
47
48
# File 'lib/harmonize/strategies/basic_crud_strategy.rb', line 41

def create_and_update_targets
  sources.each.inject([]) do |keys, source|
    target_instance = find_target_instance(harmonizer.key, source[harmonizer.key])
    modification = create_modification(target_instance)
    harmonize_target_instance!(target_instance, source, modification)
    keys << source[harmonizer.key]
  end
end

#create_modification(instance) ⇒ Object



13
14
15
16
17
18
19
# File 'lib/harmonize/strategies/basic_crud_strategy.rb', line 13

def create_modification(instance)
  unless instance.new_record?
    harmonize_log.modifications.create!(:modification_type => 'update', :before_time => DateTime.now)
  else
    harmonize_log.modifications.create!(:modification_type => 'create', :before_time => DateTime.now)
  end
end

#destroy_targets_not_found_in_source(touched_keys) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/harmonize/strategies/basic_crud_strategy.rb', line 50

def destroy_targets_not_found_in_source(touched_keys)
  # if we didn't get any touched_keys, destroy everything in targets scope
  destroy_scope = touched_keys.empty? ? targets : targets.where("#{harmonizer.key} NOT IN (?)", touched_keys)
  destroy_scope.find_each do |instance|
    modification = harmonize_log.modifications.build(
      :modification_type => 'destroy', :before_time => DateTime.now,
      :instance_id => instance.id
    )
    instance.destroy
    modification.update_attributes!(:after_time => DateTime.now)
  end
end

#find_target_instance(key, value) ⇒ Object



6
7
8
9
10
11
# File 'lib/harmonize/strategies/basic_crud_strategy.rb', line 6

def find_target_instance(key, value)
  target_relation = targets.where(key => value)
  instance = target_relation.first rescue nil
  instance ||= target_relation.build
  instance
end

#harmonize!Object



63
64
65
66
# File 'lib/harmonize/strategies/basic_crud_strategy.rb', line 63

def harmonize!
  touched_keys = create_and_update_targets
  destroy_targets_not_found_in_source(touched_keys)
end

#harmonize_target_instance!(target_instance, source, modification) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/harmonize/strategies/basic_crud_strategy.rb', line 21

def harmonize_target_instance!(target_instance, source, modification)
  # TODO: this is a mess
  error_message = nil
  errored  = false
  begin
    unless target_instance.update_attributes(source)
      errored = true
      error_message = target_instance.errors.full_messages
    end
  rescue ActiveRecord::ActiveRecordError, ActiveRecord::UnknownAttributeError => e
    errored = true
    error_message = e.message
  end
  unless errored
    modification.update_attributes!(:after_time => DateTime.now, :instance_id => target_instance.id)
  else
    modification.update_attributes!(:modification_type => 'error', :instance_errors => error_message)
  end
end