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)

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'activerecord/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?

  ensure_valid_options_for_connection!
end

Instance Attribute Details

#connectionObject (readonly)

Returns the value of attribute connection


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

def connection
  @connection
end

#insertsObject (readonly)

Returns the value of attribute inserts


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

def inserts
  @inserts
end

#keysObject (readonly)

Returns the value of attribute keys


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

def keys
  @keys
end

#modelObject (readonly)

Returns the value of attribute model


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

def model
  @model
end

#on_duplicateObject (readonly)

Returns the value of attribute on_duplicate


8
9
10
# File 'activerecord/lib/active_record/insert_all.rb', line 8

def on_duplicate
  @on_duplicate
end

#returningObject (readonly)

Returns the value of attribute returning


8
9
10
# File 'activerecord/lib/active_record/insert_all.rb', line 8

def returning
  @returning
end

#unique_byObject (readonly)

Returns the value of attribute unique_by


8
9
10
# File 'activerecord/lib/active_record/insert_all.rb', line 8

def unique_by
  @unique_by
end

Instance Method Details

#executeObject


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

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


55
56
57
58
59
60
61
62
63
64
65
66
# File 'activerecord/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_keysObject


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

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

#skip_duplicates?Boolean

Returns:

  • (Boolean)

47
48
49
# File 'activerecord/lib/active_record/insert_all.rb', line 47

def skip_duplicates?
  on_duplicate == :skip
end

#updatable_columnsObject


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

def updatable_columns
  keys - readonly_columns - unique_by_columns
end

#update_duplicates?Boolean

Returns:

  • (Boolean)

51
52
53
# File 'activerecord/lib/active_record/insert_all.rb', line 51

def update_duplicates?
  on_duplicate == :update
end