Я смог получить функциональные индексы из маршрутов Rails (3.1.3), удалив пару защитных рельсов!
# lib/functional_indexes.rb
module ActiveRecord
module ConnectionAdapters
module SchemaStatements
#disable quoting of index columns to allow functional indexes (e.g lower(full_name))
def quoted_columns_for_index(column_names, options = {})
column_names
end
def index_name_for_remove(table_name, options = {})
index_name = index_name(table_name, options)
# disable this error check -- it can't see functional indexes
#unless index_name_exists?(table_name, index_name, true)
# raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' does not exist"
#end
index_name
end
end
end
end
я должен был сделать свои собственные имена индексов, хотя:
class AddLowerCaseIndexes < ActiveRecord::Migration
def up
add_index :people, 'lower(full_name)', :name => "index_people_on_lower_full_name"
add_index :people, 'lower(company)', :name => "index_people_on_lower_company"
end
def down
remove_index :people, :name => "index_people_on_lower_full_name"
remove_index :people, :name => "index_people_on_lower_company"
end
end
(Вы, наверное, не нужно в кавычки имена столбцов индекса, если вы делаете что-то безумное, как положить пространства или странные символы в них.)
(вы, вероятно, хорошо с сообщениями Postgres ошибок при попытке откатить несуществующие индексы.)
Для того, чтобы эта миграция обратима, просто добавить в 'down': ' remove_index: temporary_events,: имя => "temporary_events_campaign_tinfoid_date_messagetype" ' –