Method: ActiveRecord::ConnectionAdapters::SchemaStatements#add_index_options

Defined in:
activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb

#add_index_options(table_name, column_name, comment: nil, **options) ⇒ Object

:nodoc:



1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb', line 1183

def add_index_options(table_name, column_name, comment: nil, **options) # :nodoc:
  column_names = index_column_names(column_name)

  options.assert_valid_keys(:unique, :order, :name, :where, :length, :internal, :using, :algorithm, :type, :opclass)

  index_type = options[:type].to_s if options.key?(:type)
  index_type ||= options[:unique] ? "UNIQUE" : ""
  index_name = options[:name].to_s if options.key?(:name)
  index_name ||= index_name(table_name, column_names)

  if options.key?(:algorithm)
    algorithm = index_algorithms.fetch(options[:algorithm]) {
      raise ArgumentError.new("Algorithm must be one of the following: #{index_algorithms.keys.map(&:inspect).join(', ')}")
    }
  end

  using = "USING #{options[:using]}" if options[:using].present?

  if supports_partial_index?
    index_options = options[:where] ? " WHERE #{options[:where]}" : ""
  end

  validate_index_length!(table_name, index_name, options.fetch(:internal, false))

  index_columns = quoted_columns_for_index(column_names, **options).join(", ")

  [index_name, index_type, index_columns, index_options, algorithm, using, comment]
end