Method: ActiveRecord::ConnectionAdapters::SchemaStatements#index_exists?

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

#index_exists?(table_name, column_name, options = {}) ⇒ Boolean

Checks to see if an index exists on a table for a given index definition.

# Check an index exists
index_exists?(:suppliers, :company_id)

# Check an index on multiple columns exists
index_exists?(:suppliers, [:company_id, :company_type])

# Check a unique index exists
index_exists?(:suppliers, :company_id, unique: true)

# Check an index with a custom name exists
index_exists?(:suppliers, :company_id, name: "idx_company_id")

Returns:

  • (Boolean)


100
101
102
103
104
105
106
107
108
# File 'activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb', line 100

def index_exists?(table_name, column_name, options = {})
  column_names = Array(column_name).map(&:to_s)
  checks = []
  checks << lambda { |i| Array(i.columns) == column_names }
  checks << lambda { |i| i.unique } if options[:unique]
  checks << lambda { |i| i.name == options[:name].to_s } if options[:name]

  indexes(table_name).any? { |i| checks.all? { |check| check[i] } }
end