J'ai pu obtenir des index fonctionnels à partir des migrations de Rails (3.1.3) en enlevant quelques garde-corps!
# 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
je devais faire mes propres noms d'index, si:
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
(Vous n'avez probablement pas besoin de guillemets autour de vos noms de colonnes d'index, sauf si vous faites quelque chose de fou comme mettre des espaces ou des personnages étranges en eux.)
(vous êtes probablement très bien avec des messages d'erreur postgres lors d'une tentative de rollback index non existants.)
Pour rendre cette migration réversible, il suffit d'ajouter à 'down': ' remove_index: temporary_events,: name => "temporary_events_campaign_tinfoid_date_messagetype" ' –