How to fix the Index name too long error in rails migrations

Today, I was reviewing some legacy code, trying to isolate the bottlenecks and pinpoint the optimisation strategies for scaling and performance optimisations of a rails app.

As the usual procedure, I wanted to check the database indexes and see if something was missing here. And my guess was in the right direction. Some of the indexes were missing.

So the next obvious thing to do:

Create a migration for adding the missing indexes.

I thought it was gonna be a breeze, I generated the migration, filled the migration file with the correct table name and fields etc, but when I tried to run the migration, I stumbled upon an issue.

ArgumentError: Index name 'index_loan_application_status_message_template_groups_on_message_template_group_id' on table 'loan_application_status_message_template_groups' is too long; the limit is 63 characters

Problem: The index name is too long

So here is what my migration looked like:

class IndexForeignKeysInLoanApplicationStatusMessageTemplateGroups < ActiveRecord::Migration
def change
add_index :loan_application_status_message_template_groups,
:message_template_group_id
end
end

After a bit of googling I learned that PostgreSQL has a limit of 63 char for naming, as can be found here.

So I need to keep my index identified under 63 chars.

And our nice folks who build rails/active record have given us a nice way to accomplish this.

Solution: You can specify the name of the index and keep it under the 63 chars mark by passing values to the name argument in your migration.

So I modified my migration to the following:

class IndexForeignKeysInLoanApplicationStatusMessageTemplateGroups < ActiveRecord::Migration
def change
add_index :loan_application_status_message_template_groups,
:message_template_group_id,
name: 'loan_application_status_message_template_group_index'
end
end

Hope that helps someone. :)


Originally published at til.codes on March 16, 2017.

A single golf clap? Or a long standing ovation?

By clapping more or less, you can signal to us which stories really stand out.