While this index name handling fix is designed for Oracle, it should work just as well with other DBs, as long as the table_alias_length is also what you want for the index name max length.
# Oracle limitations workaround
module ActiveRecord::ConnectionAdapters::SchemaStatements
# Oracle has an ancient limit of 30 characters for identifiers. Eek!
# Autogenerate index_names that fit in the db-specific limit.
#
# TODO: index_name and friends not implemented yet!
alias :add_index_without_limit :add_index
alias :index_name_without_limit :index_name
# TODO: not implemented yet!
def index_name(table_name, options) #:nodoc:
index_name = index_name_without_limit table_name, options
end
def add_index(table_name, column_name, options = {})
index_name = "#{table_name}_#{Array(column_name).first}_index"
if Hash === options # legacy support, since this param was a string
index_type = options[:unique] ? "UNIQUE" : nil
index_name = options[:name] || index_name
else
index_type = options
options = {}
end
if index_name.length > table_alias_length
# Highly questionable hash function :-)
def myhash(n)
(n.hash % 0x81bf1000).to_s(36)
end
index_name = index_name[0..(table_alias_length-11)] +
myhash(index_name[(table_alias_length-10)..-1]) + "_idx"
end
options[:unique] = index_type if index_type
options[:name] = index_name
# Rails <= 1.1.2 only (Edge already does this!)
column_name = Array(column_name).map{|name| quote_column_name name}
add_index_without_limit table_name, column_name, options
end
end