Class: ActiveRecord::InsertAll
- Inherits:
-
Object
- Object
- ActiveRecord::InsertAll
- Defined in:
- lib/active_record/insert_all.rb
Overview
:nodoc:
Defined Under Namespace
Classes: Builder
Instance Attribute Summary collapse
-
#connection ⇒ Object
readonly
Returns the value of attribute connection.
-
#inserts ⇒ Object
readonly
Returns the value of attribute inserts.
-
#keys ⇒ Object
readonly
Returns the value of attribute keys.
-
#model ⇒ Object
readonly
Returns the value of attribute model.
-
#on_duplicate ⇒ Object
readonly
Returns the value of attribute on_duplicate.
-
#returning ⇒ Object
readonly
Returns the value of attribute returning.
-
#unique_by ⇒ Object
readonly
Returns the value of attribute unique_by.
-
#update_only ⇒ Object
readonly
Returns the value of attribute update_only.
-
#update_sql ⇒ Object
readonly
Returns the value of attribute update_sql.
Instance Method Summary collapse
- #execute ⇒ Object
-
#initialize(model, inserts, on_duplicate:, update_only: nil, returning: nil, unique_by: nil, record_timestamps: nil) ⇒ InsertAll
constructor
A new instance of InsertAll.
-
#keys_including_timestamps ⇒ Object
TODO: Consider remaining this method, as it only conditionally extends keys, not always.
- #map_key_with_value ⇒ Object
- #primary_keys ⇒ Object
- #record_timestamps? ⇒ Boolean
- #skip_duplicates? ⇒ Boolean
- #updatable_columns ⇒ Object
- #update_duplicates? ⇒ Boolean
Constructor Details
#initialize(model, inserts, on_duplicate:, update_only: nil, returning: nil, unique_by: nil, record_timestamps: nil) ⇒ InsertAll
Returns a new instance of InsertAll.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/active_record/insert_all.rb', line 10 def initialize(model, inserts, on_duplicate:, update_only: nil, returning: nil, unique_by: nil, record_timestamps: nil) raise ArgumentError, "Empty list of attributes passed" if inserts.blank? @model, @connection, @inserts, @keys = model, model.connection, inserts, inserts.first.keys.map(&:to_s) @on_duplicate, @update_only, @returning, @unique_by = on_duplicate, update_only, returning, unique_by @record_timestamps = .nil? ? model. : disallow_raw_sql!(on_duplicate) disallow_raw_sql!(returning) configure_on_duplicate_update_logic if model.scope_attributes? @scope_attributes = model.scope_attributes @keys |= @scope_attributes.keys end @keys = @keys.to_set @returning = (connection.supports_insert_returning? ? primary_keys : false) if @returning.nil? @returning = false if @returning == [] @unique_by = find_unique_index_for(unique_by) @on_duplicate = :skip if @on_duplicate == :update && updatable_columns.empty? end |
Instance Attribute Details
#connection ⇒ Object (readonly)
Returns the value of attribute connection.
7 8 9 |
# File 'lib/active_record/insert_all.rb', line 7 def connection @connection end |
#inserts ⇒ Object (readonly)
Returns the value of attribute inserts.
7 8 9 |
# File 'lib/active_record/insert_all.rb', line 7 def inserts @inserts end |
#keys ⇒ Object (readonly)
Returns the value of attribute keys.
7 8 9 |
# File 'lib/active_record/insert_all.rb', line 7 def keys @keys end |
#model ⇒ Object (readonly)
Returns the value of attribute model.
7 8 9 |
# File 'lib/active_record/insert_all.rb', line 7 def model @model end |
#on_duplicate ⇒ Object (readonly)
Returns the value of attribute on_duplicate.
8 9 10 |
# File 'lib/active_record/insert_all.rb', line 8 def on_duplicate @on_duplicate end |
#returning ⇒ Object (readonly)
Returns the value of attribute returning.
8 9 10 |
# File 'lib/active_record/insert_all.rb', line 8 def returning @returning end |
#unique_by ⇒ Object (readonly)
Returns the value of attribute unique_by.
8 9 10 |
# File 'lib/active_record/insert_all.rb', line 8 def unique_by @unique_by end |
#update_only ⇒ Object (readonly)
Returns the value of attribute update_only.
8 9 10 |
# File 'lib/active_record/insert_all.rb', line 8 def update_only @update_only end |
#update_sql ⇒ Object (readonly)
Returns the value of attribute update_sql.
8 9 10 |
# File 'lib/active_record/insert_all.rb', line 8 def update_sql @update_sql end |
Instance Method Details
#execute ⇒ Object
37 38 39 40 41 42 |
# File 'lib/active_record/insert_all.rb', line 37 def execute = +"#{model} " << "Bulk " if inserts.many? << (on_duplicate == :update ? "Upsert" : "Insert") connection.exec_insert_all to_sql, end |
#keys_including_timestamps ⇒ Object
TODO: Consider remaining this method, as it only conditionally extends keys, not always
80 81 82 83 84 85 86 |
# File 'lib/active_record/insert_all.rb', line 80 def @keys_including_timestamps ||= if keys + model. else keys end end |
#map_key_with_value ⇒ Object
61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/active_record/insert_all.rb', line 61 def map_key_with_value inserts.map do |attributes| attributes = attributes.stringify_keys attributes.merge!(scope_attributes) if scope_attributes attributes.reverse_merge!() if verify_attributes(attributes) .map do |key| yield key, attributes[key] end end end |
#primary_keys ⇒ Object
48 49 50 |
# File 'lib/active_record/insert_all.rb', line 48 def primary_keys Array(connection.schema_cache.primary_keys(model.table_name)) end |
#record_timestamps? ⇒ Boolean
75 76 77 |
# File 'lib/active_record/insert_all.rb', line 75 def @record_timestamps end |
#skip_duplicates? ⇒ Boolean
53 54 55 |
# File 'lib/active_record/insert_all.rb', line 53 def skip_duplicates? on_duplicate == :skip end |
#updatable_columns ⇒ Object
44 45 46 |
# File 'lib/active_record/insert_all.rb', line 44 def updatable_columns @updatable_columns ||= keys - readonly_columns - unique_by_columns end |
#update_duplicates? ⇒ Boolean
57 58 59 |
# File 'lib/active_record/insert_all.rb', line 57 def update_duplicates? on_duplicate == :update end |