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

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

Instance Method Summary collapse

Instance Method Details

#_prepare_column(column) ⇒ Object



83
84
85
86
87
88
89
90
91
# File 'lib/active_record_upsert/active_record/persistence.rb', line 83

def _prepare_column(column)
  column = attribute_alias(column) if attribute_alias?(column)

  if columns_hash.key?(column)
    column
  elsif reflections.key?(column)
    reflections[column].foreign_key
  end
end

#_upsert_record(existing_attributes, upsert_attributes_names, wheres) ⇒ Object

:nodoc:



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/active_record_upsert/active_record/persistence.rb', line 58

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']

  existing_attributes = existing_attributes
    .transform_keys { |name| _prepare_column(name) }
    .reject { |key, _| key.nil? }

  upsert_attributes_names = upsert_attributes_names
    .map { |name| _prepare_column(name) }
    .compact

  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



106
107
108
109
# File 'lib/active_record_upsert/active_record/persistence.rb', line 106

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

#upsert(*args) ⇒ Object



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

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

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



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

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



93
94
95
96
97
98
99
100
# File 'lib/active_record_upsert/active_record/persistence.rb', line 93

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)
  @_upsert_options = options
end

#upsert_optionsObject



102
103
104
# File 'lib/active_record_upsert/active_record/persistence.rb', line 102

def upsert_options
  @_upsert_options || {}
end