2015-02-07 6 views

ответ

17

На одном из адаптеров адаптеров ActiveRecord есть метод index_exists?.

Вы можете использовать его как это:

Image.connection.index_exists? :images, :post_id 
+5

Он всегда возвращает 'false' даже в случае атрибута': id'. Я что-то делаю неправильно? Referral.connection.index_exists? : рефералы,: id'? – kamal

+0

@kamal 'index_exists?' Проверяет, что любой индекс существует в столбце. Не знаю, как это проверяется, но для меня это также иногда возвращает false. Существует также [index_name_exists?] (Http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-index_name_exists-3F), чтобы проверить индекс по имени, он хорошо работает для пользовательских индексов – ololobus

+0

@ ololobus, но этот метод 'index_name_exist?' требует знать по имени индекса, что трудно понять, потому что вы даже не знаете, есть ли индекс или нет или для которого вы действительно ищете. – kamal

1

Следующие работал для меня:

ActiveRecord::Base.connection.index_exists?(:table_name, :column_name) 
4

Как уже упоминалось, вы можете использовать следующую команду для проверки, если индекс столбца существует :

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)

Смежные вопросы