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

Defined in:
lib/active_record_upsert/compatibility/rails70.rb,
lib/active_record_upsert/active_record/persistence.rb

Instance Method Summary collapse

Instance Method Details

#__substitute_values(values, table) ⇒ Object



5
6
7
8
9
10
11
12
13
14
# File 'lib/active_record_upsert/compatibility/rails70.rb', line 5

def __substitute_values(values, table)
  values.map do |name, value|
    attr = table[name]
    unless ::Arel.arel_node?(value) || value.is_a?(::ActiveModel::Attribute)
      type = type_for_attribute(attr.name)
      value = predicate_builder.build_bind_attribute(attr.name, type.cast(value))
    end
    [attr, value]
  end
end

#_prepare_column(column) ⇒ Object



86
87
88
89
90
91
92
93
94
# File 'lib/active_record_upsert/active_record/persistence.rb', line 86

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, opts) ⇒ Object

:nodoc:



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/active_record_upsert/compatibility/rails70.rb', line 16

def _upsert_record(existing_attributes, upsert_attributes_names, wheres, opts) # :nodoc:
  upsert_keys = opts[:upsert_keys] || self.upsert_keys || [primary_key]
  upsert_options = opts[:upsert_options] || self.upsert_options
  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, arel_table),
    __substitute_values(existing_attributes, arel_table),
    wheres
  )

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

#inherited(subclass) ⇒ Object



109
110
111
112
# File 'lib/active_record_upsert/active_record/persistence.rb', line 109

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

#upsert(attributes, **kwargs, &block) ⇒ Object



54
55
56
57
58
# File 'lib/active_record_upsert/active_record/persistence.rb', line 54

def upsert(attributes, **kwargs, &block)
  upsert!(attributes, **kwargs, &block)
rescue ::ActiveRecord::RecordInvalid
  false
end

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



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

def upsert!(attributes, arel_condition: nil, validate: true, opts: {}, &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, opts: opts
    )
  end
end

#upsert_keys(*keys) ⇒ Object



96
97
98
99
100
101
102
103
# File 'lib/active_record_upsert/active_record/persistence.rb', line 96

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



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

def upsert_options
  @_upsert_options || {}
end