Module: ActiveRecordUpsert::ActiveRecord::PersistenceExtensions

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

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#_upsert_record(attribute_names = changed) ⇒ Object



23
24
25
26
27
28
# File 'lib/active_record_upsert/active_record/persistence.rb', line 23

def _upsert_record(attribute_names = changed)
  attributes_values = arel_attributes_with_values_for_create(attribute_names)
  values = self.class.unscoped.upsert attributes_values
  @new_record = false
  values
end

#upsert(attribute_names = nil) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/active_record_upsert/active_record/persistence.rb', line 5

def upsert(attribute_names=nil)
  raise ::ActiveRecord::ReadOnlyRecord, "#{self.class} is marked as readonly" if readonly?
  raise ::ActiveRecord::RecordSavedError, "Can't upsert a record that has already been saved" if persisted?
  values = run_callbacks(:save) {
    run_callbacks(:create) {
      attribute_names ||= changed
      attribute_names = attribute_names.map(&:to_s) +
        timestamp_attributes_for_create_in_model +
        timestamp_attributes_for_update_in_model
      _upsert_record(attribute_names.uniq)
    }
  }
  assign_attributes(values.first.to_h)
  self
rescue ::ActiveRecord::RecordInvalid
  false
end