Rails db:migrate error, index is too long
The other day I created the following migration:
class CreatePrivateLabelPlanAssignments < ActiveRecord::Migration
def change
create_table :private_label_plan_assignments do |t|
t.belongs_to :private_label_account
t.belongs_to :plan
t.timestamps
end
add_index :private_label_plan_assignments, :private_label_account_id
add_index :private_label_plan_assignments, :plan_id
end
end
When I rake the migration rake db:migrate
I got the following error:
-- add_index(:private_label_plan_assignments, :private_label_account_id)
rake aborted!
An error has occurred, this and all later migrations canceled:
Index name
'index_private_label_plan_assignments_on_private_label_account_id' on
table 'private_label_plan_assignments' is too long; the limit is 63
characters/Users/jess/Dropbox/websites/gypsi/gypsi-web/.bundle/gems/ruby/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/schema_statements.rb:573:in
`add_index_options''`
I remembered vaguely running into this issue before, but couldn't remember what the problem was, so I had do to the research all over again. Luckily, I found it rather quickly, but I wanted to write it down somewhere so I could either remember it next time or better reference it. Maybe you'll find it helpful too.
The issue is the add_index
method in rails automatically creates an
index name in the database. However, the database has it's own limits
and in this case, 63 characters is the limit for an index name.
The simple solution is to manually name the index and luckily rails
provides that option in the add_index
method call. So, just change
your migration to have a manual name like so:
class CreatePrivateLabelPlanAssignments < ActiveRecord::Migration
def change
create_table :private_label_plan_assignments do |t|
t.belongs_to :private_label_account
t.belongs_to :plan
t.timestamps
end
add_index :private_label_plan_assignments, :private_label_account_id, name: "private_label_id"
add_index :private_label_plan_assignments, :plan_id, name: "plan_id"
end
end
Hope this helps!