Подтвердить что ты не робот

Как проверить, есть ли указатель на столбце через консоль rails?

Скажем, я делаю Image.column_names и показывает все столбцы, такие как post_id но как проверить, имеет ли post_id индекс на нем?

4b9b3361

Ответ 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