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
- #__substitute_values(values, table) ⇒ Object
- #_prepare_column(column) ⇒ Object
-
#_upsert_record(existing_attributes, upsert_attributes_names, wheres, opts) ⇒ Object
:nodoc:.
- #inherited(subclass) ⇒ Object
- #upsert(attributes, **kwargs, &block) ⇒ Object
- #upsert!(attributes, arel_condition: nil, validate: true, opts: {}, &block) ⇒ Object
- #upsert_keys(*keys) ⇒ Object
- #upsert_options ⇒ Object
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] = opts[:upsert_options] || self. 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, , __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, ) 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? = keys. 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 = end |
#upsert_options ⇒ Object
105 106 107 |
# File 'lib/active_record_upsert/active_record/persistence.rb', line 105 def @_upsert_options || {} end |