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
|