trabajo-afectivo/lib/sequencer/unit/import/common/model/lookup/attributes.rb

66 lines
1.9 KiB
Ruby
Raw Normal View History

class Sequencer
class Unit
module Import
module Common
module Model
module Lookup
class Attributes < Sequencer::Unit::Base
include ::Sequencer::Unit::Import::Common::Model::Mixin::HandleFailure
prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
skip_action :skipped, :failed
uses :mapped, :model_class
provides :instance
def process
return if state.provided?(:instance)
return if existing_instance.blank?
state.provide(:instance, existing_instance)
end
private
def attribute
raise "Missing implementation of '#{__method__}' method for '#{self.class.name}'"
end
def attributes
# alias or alias_method won't work if attribute method
# is overwritten in inheriting sub-class
attribute
end
def existing_instance
@existing_instance ||= begin
Array(attributes).find do |attribute|
value = mapped[attribute]
next if value.blank?
existing_instance = lookup(
attribute: attribute,
value: value
)
next if existing_instance.blank?
# https://stackoverflow.com/a/24901650/7900866
break existing_instance
end
end
end
def lookup(attribute:, value:)
return model_class.identify(value) if model_class.respond_to?(:identify)
model_class.find_by(attribute => value)
end
end
end
end
end
end
end
end