Search code examples
ruby-on-railspostgresqlruby-on-rails-4indexingmigration

Index name "index_name" is too long; the limit is 63 characters


when I'm running rails migration command. I'm getting index name is too long. My migration file

class AddMissingIndices < ActiveRecord::Migration
  def change
    # We'll explicitly specify its name, as the auto-generated name is too long and exceeds 63
    # characters limitation.
    add_index :mailboxer_conversation_opt_outs, [:unsubscriber_id, :unsubscriber_type],
      name: 'index_mailboxer_conversation_opt_outs_on_unsubscriber_id_type'
    add_index :mailboxer_conversation_opt_outs, :conversation_id

    add_index :mailboxer_notifications, :type
    add_index :mailboxer_notifications, [:sender_id, :sender_type]

    # We'll explicitly specify its name, as the auto-generated name is too long and exceeds 63
    # characters limitation.
    add_index :mailboxer_notifications, [:notified_object_id, :notified_object_type],
      name: 'index_mailboxer_notifications_on_notified_object_id_and_type'

    add_index :mailboxer_receipts, [:receiver_id, :receiver_type]
  end
end

Server logs are

rails aborted!

StandardError: An error has occurred, this and all later migrations canceled:

Index name 'index_mailboxer_conversation_opt_outs_on_unsubscriber_type_and_unsubscriber_id' on table 'mailboxer_conversation_opt_outs' is too long; the limit is 63 characters /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/schema_statements.rb:1353:in validate_index_length!' /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/schema_statements.rb:1166:inadd_index_options' /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql/schema_statements.rb:465:in add_index' /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/schema_statements.rb:315:inblock in create_table' /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/schema_statements.rb:314:in each' /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/schema_statements.rb:314:increate_table' /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/migration.rb:871:in block in method_missing' /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/migration.rb:840:inblock in say_with_time' /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/migration.rb:840:in say_with_time' /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/migration.rb:860:inmethod_missing' /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/migration/compatibility.rb:36:in create_table' /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/migration/compatibility.rb:75:increate_table' /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/migration.rb:604:in method_missing' /home/sharat/rahul/Fleet-Latest/db/migrate/20170425092621_add_conversation_optout.mailboxer_engine.rb:4:inup' /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/migration.rb:777:in `up'


Solution

  • You can try creating the index with a custom (and shorter) name:

    add_index(:accounts, [:branch_id, :party_id], unique: true, name: 'my_custom_and_shorter_name')

    Since you already have the name field there, just change the index name :)