Class: ActiveRecord::InsertAll

Inherits:
Object
  • Object
show all
Defined in:
activerecord/lib/active_record/insert_all.rb

Overview

:nodoc:

Defined Under Namespace

Classes: Builder

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model, inserts, on_duplicate:, returning: nil, unique_by: nil) ⇒ InsertAll

Returns a new instance of InsertAll.

Raises:

  • (ArgumentError)


8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'activerecord/lib/active_record/insert_all.rb', line 8

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).to_set
  @on_duplicate, @returning, @unique_by = on_duplicate, returning, unique_by

  @returning = (connection.supports_insert_returning? ? primary_keys : false) if @returning.nil?
  @returning = false if @returning == []

  @unique_by = find_unique_index_for(unique_by || model.primary_key)
  @on_duplicate = :skip if @on_duplicate == :update && updatable_columns.empty?

  ensure_valid_options_for_connection!
end

Instance Attribute Details

#connectionObject (readonly)

Returns the value of attribute connection



5
6
7
# File 'activerecord/lib/active_record/insert_all.rb', line 5

def connection
  @connection
end

#insertsObject (readonly)

Returns the value of attribute inserts



5
6
7
# File 'activerecord/lib/active_record/insert_all.rb', line 5

def inserts
  @inserts
end

#keysObject (readonly)

Returns the value of attribute keys



5
6
7
# File 'activerecord/lib/active_record/insert_all.rb', line 5

def keys
  @keys
end

#modelObject (readonly)

Returns the value of attribute model



5
6
7
# File 'activerecord/lib/active_record/insert_all.rb', line 5

def model
  @model
end

#on_duplicateObject (readonly)

Returns the value of attribute on_duplicate



6
7
8
# File 'activerecord/lib/active_record/insert_all.rb', line 6

def on_duplicate
  @on_duplicate
end

#returningObject (readonly)

Returns the value of attribute returning



6
7
8
# File 'activerecord/lib/active_record/insert_all.rb', line 6

def returning
  @returning
end

#unique_byObject (readonly)

Returns the value of attribute unique_by



6
7
8
# File 'activerecord/lib/active_record/insert_all.rb', line 6

def unique_by
  @unique_by
end

Instance Method Details

#executeObject



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

def execute
  message = +"#{model} "
  message << "Bulk " if inserts.many?
  message << (on_duplicate == :update ? "Upsert" : "Insert")
  connection.exec_insert_all to_sql, message
end

#map_key_with_valueObject



47
48
49
50
51
52
53
54
55
56
# File 'activerecord/lib/active_record/insert_all.rb', line 47

def map_key_with_value
  inserts.map do |attributes|
    attributes = attributes.stringify_keys
    verify_attributes(attributes)

    keys.map do |key|
      yield key, attributes[key]
    end
  end
end

#primary_keysObject



34
35
36
# File 'activerecord/lib/active_record/insert_all.rb', line 34

def primary_keys
  Array(connection.schema_cache.primary_keys(model.table_name))
end

#skip_duplicates?Boolean

Returns:

  • (Boolean)


39
40
41
# File 'activerecord/lib/active_record/insert_all.rb', line 39

def skip_duplicates?
  on_duplicate == :skip
end

#updatable_columnsObject



30
31
32
# File 'activerecord/lib/active_record/insert_all.rb', line 30

def updatable_columns
  keys - readonly_columns - unique_by_columns
end

#update_duplicates?Boolean

Returns:

  • (Boolean)


43
44
45
# File 'activerecord/lib/active_record/insert_all.rb', line 43

def update_duplicates?
  on_duplicate == :update
end