Скажем, я делаю Image.column_names и показывает все столбцы, такие как post_id но как проверить, имеет ли post_id индекс на нем?
Как проверить, есть ли указатель на столбце через консоль rails?
Ответ 1
Существует один метод index_exists? на одном из классов адаптеров подключения ActiveRecord.
Вы можете использовать его следующим образом:
Image.connection.index_exists? :images, :post_id
Ответ 2
Как уже упоминалось, вы можете использовать следующее, чтобы проверить, существует ли индекс в столбце:
ActiveRecord::Base.connection.index_exists?(:table_name, :column_name)
Однако стоит отметить, что это возвращает только true, если существует индекс, который индексирует этот столбец и только этот столбец. Он не будет возвращать true, если вы используете составные индексы, которые включают ваш столбец. Вы можете увидеть все индексы для таблицы с
ActiveRecord::Base.connection.indexes(:table_name)
Если вы посмотрите на исходный код для index_exists?
, вы увидите, что внутренне он использует indexes
, чтобы выяснить, существует или нет ваш индекс. Поэтому, если, как и я, их логика не подходит для вашего варианта использования, вы можете прокрутить эти индексы и посмотреть, будет ли один из них работать. В моем случае логика была таким образом:
ActiveRecord::Base.connection.indexes(:table_name).select { |i| i.columns.first == column_name.to_s}.any?
Также важно отметить, что indexes
не возвращает индекс, который рельсы автоматически генерируют для идентификаторов, что объясняет, почему некоторые люди выше имели проблемы с вызовами index_exists?(:table_name, :id)
Ответ 3
Следующие работали для меня:
ActiveRecord::Base.connection.index_exists?(:table_name, :column_name)
Ответ 4
Для получения обновленного ответа, в случае нескольких столбцов Rails 3+, уникальность и пользовательское имя поддерживаются в методе #index_exists?
.
# 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")
Источник: Rails 6 Docs