Class: ActiveRecord::InsertAll::Builder
Do not use. This class is for internal use only.
Relationships & Source Files | |
Inherits: | Object |
Defined in: | activerecord/lib/active_record/insert_all.rb |
Class Method Summary
- .new(insert_all) ⇒ Builder constructor
Instance Attribute Summary
- #keys readonly
- #keys_including_timestamps readonly
- #model readonly
- #raw_update_sql (also: #raw_update_sql?) readonly
-
#raw_update_sql?
readonly
Alias for #raw_update_sql.
- #connection readonly private
- #insert_all readonly private
Instance Method Summary
- #conflict_target
- #into
- #record_timestamps? ⇒ Boolean
- #returning
- #skip_duplicates? ⇒ Boolean
- #touch_model_timestamps_unless(&block)
- #updatable_columns
- #update_duplicates? ⇒ Boolean
- #values_list
- #columns_list private
- #extract_types_from_columns_on(table_name, keys:) private
- #format_columns(columns) private
- #quote_column(column) private
- #quote_columns(columns) private
- #touch_timestamp_attribute?(column_name) ⇒ Boolean private
Constructor Details
.new(insert_all) ⇒ Builder
# File 'activerecord/lib/active_record/insert_all.rb', line 230
def initialize(insert_all) @insert_all, @model, @connection = insert_all, insert_all.model, insert_all.connection end
Instance Attribute Details
#connection (readonly, private)
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 296
attr_reader :connection, :insert_all
#insert_all (readonly, private)
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 296
attr_reader :connection, :insert_all
#keys (readonly)
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 228
delegate :skip_duplicates?, :update_duplicates?, :keys, :, :, to: :insert_all
#keys_including_timestamps (readonly)
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 228
delegate :skip_duplicates?, :update_duplicates?, :keys, :, :, to: :insert_all
#model (readonly)
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 226
attr_reader :model
#raw_update_sql (readonly) Also known as: #raw_update_sql?
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 289
def raw_update_sql insert_all.update_sql end
#raw_update_sql? (readonly)
Alias for #raw_update_sql.
# File 'activerecord/lib/active_record/insert_all.rb', line 293
alias raw_update_sql? raw_update_sql
Instance Method Details
#columns_list (private)
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 302
def columns_list format_columns(insert_all. ) end
#conflict_target
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 265
def conflict_target if index = insert_all.unique_by sql = +"(#{format_columns(index.columns)})" sql << " WHERE #{index.where}" if index.where sql elsif update_duplicates? "(#{format_columns(insert_all.primary_keys)})" end end
#extract_types_from_columns_on(table_name, keys:) (private)
# File 'activerecord/lib/active_record/insert_all.rb', line 306
def extract_types_from_columns_on(table_name, keys:) columns = @model.schema_cache.columns_hash(table_name) unknown_column = (keys - columns.keys).first raise UnknownAttributeError.new(model.new, unknown_column) if unknown_column keys.index_with { |key| model.type_for_attribute(key) } end
#format_columns(columns) (private)
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 315
def format_columns(columns) columns.respond_to?(:map) ? quote_columns(columns).join(",") : columns end
#into
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 234
def into "INTO #{model.quoted_table_name} (#{columns_list})" end
#quote_column(column) (private)
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 323
def quote_column(column) connection.quote_column_name(column) end
#quote_columns(columns) (private)
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 319
def quote_columns(columns) columns.map { |column| quote_column(column) } end
#record_timestamps? ⇒ Boolean
# File 'activerecord/lib/active_record/insert_all.rb', line 228
delegate :skip_duplicates?, :update_duplicates?, :keys, :, :, to: :insert_all
#returning
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 249
def returning return unless insert_all.returning if insert_all.returning.is_a?(String) insert_all.returning else Array(insert_all.returning).map do |attribute| if model.attribute_alias?(attribute) "#{quote_column(model.attribute_alias(attribute))} AS #{quote_column(attribute)}" else quote_column(attribute) end end.join(",") end end
#skip_duplicates? ⇒ Boolean
# File 'activerecord/lib/active_record/insert_all.rb', line 228
delegate :skip_duplicates?, :update_duplicates?, :keys, :, :, to: :insert_all
#touch_model_timestamps_unless(&block)
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 279
def (&block) return "" unless update_duplicates? && model. .filter_map do |column_name| if (column_name) "#{column_name}=(CASE WHEN (#{updatable_columns.map(&block).join(" AND ")}) THEN #{model.quoted_table_name}.#{column_name} ELSE #{connection.} END)," end end.join end
#touch_timestamp_attribute?(column_name) ⇒ Boolean
(private)
# File 'activerecord/lib/active_record/insert_all.rb', line 298
def (column_name) insert_all.updatable_columns.exclude?(column_name) end
#updatable_columns
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 275
def updatable_columns quote_columns(insert_all.updatable_columns) end
#update_duplicates? ⇒ Boolean
# File 'activerecord/lib/active_record/insert_all.rb', line 228
delegate :skip_duplicates?, :update_duplicates?, :keys, :, :, to: :insert_all
#values_list
[ GitHub ]# File 'activerecord/lib/active_record/insert_all.rb', line 238
def values_list types = extract_types_from_columns_on(model.table_name, keys: ) values_list = insert_all.map_key_with_value do |key, value| next value if Arel::Nodes::SqlLiteral === value ActiveModel::Type::SerializeCastValue.serialize(type = types[key], type.cast(value)) end connection.visitor.compile(Arel::Nodes::ValuesList.new(values_list)) end