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.
Instance Method Summary collapse
- #execute ⇒ Object
-
#initialize(model, inserts, on_duplicate:, returning: nil, unique_by: nil) ⇒ InsertAll
constructor
A new instance of InsertAll.
- #map_key_with_value ⇒ Object
- #primary_keys ⇒ Object
- #skip_duplicates? ⇒ Boolean
- #updatable_columns ⇒ Object
- #update_duplicates? ⇒ Boolean
Constructor Details
#initialize(model, inserts, on_duplicate:, returning: nil, unique_by: 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 |
# File 'lib/active_record/insert_all.rb', line 10 def initialize(model, inserts, on_duplicate:, returning: nil, unique_by: 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, @returning, @unique_by = on_duplicate, returning, unique_by 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 |
Instance Method Details
#execute ⇒ Object
31 32 33 34 35 36 |
# File 'lib/active_record/insert_all.rb', line 31 def execute = +"#{model} " << "Bulk " if inserts.many? << (on_duplicate == :update ? "Upsert" : "Insert") connection.exec_insert_all to_sql, end |
#map_key_with_value ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/active_record/insert_all.rb', line 55 def map_key_with_value inserts.map do |attributes| attributes = attributes.stringify_keys attributes.merge!(scope_attributes) if scope_attributes verify_attributes(attributes) keys.map do |key| yield key, attributes[key] end end end |
#primary_keys ⇒ Object
42 43 44 |
# File 'lib/active_record/insert_all.rb', line 42 def primary_keys Array(connection.schema_cache.primary_keys(model.table_name)) end |
#skip_duplicates? ⇒ Boolean
47 48 49 |
# File 'lib/active_record/insert_all.rb', line 47 def skip_duplicates? on_duplicate == :skip end |
#updatable_columns ⇒ Object
38 39 40 |
# File 'lib/active_record/insert_all.rb', line 38 def updatable_columns keys - readonly_columns - unique_by_columns end |
#update_duplicates? ⇒ Boolean
51 52 53 |
# File 'lib/active_record/insert_all.rb', line 51 def update_duplicates? on_duplicate == :update end |