Module: ActiveRecordUpsert::ActiveRecord::PersistenceExtensions::ClassMethods

Defined in:
lib/active_record_upsert/active_record/persistence.rb

Instance Method Summary collapse

Instance Method Details

#_upsert_record(existing_attributes, upsert_attributes_names, wheres) ⇒ Object

:nodoc:



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/active_record_upsert/active_record/persistence.rb', line 57

def _upsert_record(existing_attributes, upsert_attributes_names, wheres) # :nodoc:
  upsert_keys = self.upsert_keys || [primary_key]
  upsert_attributes_names = upsert_attributes_names - [*upsert_keys, 'created_at']
  values_for_upsert = existing_attributes.select { |(name, _value)| upsert_attributes_names.include?(name) }

  insert_manager = arel_table.compile_upsert(
    upsert_keys,
    upsert_options,
    _substitute_values(values_for_upsert),
    _substitute_values(existing_attributes),
    wheres
  )

  connection.upsert(insert_manager, "#{self} Upsert")
end

#inherited(subclass) ⇒ Object



86
87
88
89
# File 'lib/active_record_upsert/active_record/persistence.rb', line 86

def inherited(subclass)
  super
  subclass.upsert_keys(upsert_keys, upsert_options)
end

#upsert(*args) ⇒ Object



51
52
53
54
55
# File 'lib/active_record_upsert/active_record/persistence.rb', line 51

def upsert(*args)
  upsert!(*args)
rescue ::ActiveRecord::RecordInvalid
  false
end

#upsert!(attributes, arel_condition: nil, validate: true, &block) ⇒ Object



41
42
43
44
45
46
47
48
49
# File 'lib/active_record_upsert/active_record/persistence.rb', line 41

def upsert!(attributes, arel_condition: nil, validate: true, &block)
  if attributes.is_a?(Array)
    attributes.collect { |hash| upsert(hash, &block) }
  else
    new(attributes, &block).upsert!(
      attributes: attributes.keys, arel_condition: arel_condition, validate: validate
    )
  end
end

#upsert_keys(*keys) ⇒ Object



73
74
75
76
77
78
79
80
# File 'lib/active_record_upsert/active_record/persistence.rb', line 73

def upsert_keys(*keys)
  return @_upsert_keys if keys.empty?
  options = keys.extract_options!
  keys = keys.first if keys.size == 1 # support single string/symbol, multiple string/symbols, and array
  return if keys.nil?
  @_upsert_keys = Array(keys).map(&:to_s)
  @_upsert_options = options
end

#upsert_optionsObject



82
83
84
# File 'lib/active_record_upsert/active_record/persistence.rb', line 82

def upsert_options
  @_upsert_options || {}
end