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



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

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:



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

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),
    _substitute_values(existing_attributes),
    wheres
  )

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

#inherited(subclass) ⇒ Object



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

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

#upsert(*args) ⇒ Object



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

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

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



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

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



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

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



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

def upsert_options
  @_upsert_options || {}
end