索引名称" index_name"太长;限制为63个字符

时间:2018-05-02 07:13:12

标签: ruby-on-rails ruby postgresql ruby-on-rails-4

当我运行rails migration命令时。我的索引名称太长了。 我的迁移文件

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

服务器日志

  

导轨已中止!

     

StandardError:发生错误,此操作和所有后​​续迁移都已取消:

     

索引名称&#39; index_mailboxer_conversation_opt_outs_on_unsubscriber_type_and_unsubscriber_id&#39;在桌子上&#39; mailboxer_conversation_opt_outs&#39;太长;限制为63个字符   /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:in add_index_options&#39;   /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:in块中的create_table&#39;   /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:in create_table&#39;   /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:in阻止在say_with_time&#39;   /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:in method_missing&#39;   /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:in create_table&#39;   /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:in up&#39;   /home/sharat/.rvm/gems/ruby-2.4.3/gems/activerecord-5.2.0/lib/active_record/migration.rb:777:in`up up&#39;

2 个答案:

答案 0 :(得分:2)

https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html

  

系统使用的标识符不超过NAMEDATALEN-1个字节;   较长的名称可以用命令编写,但它们会被截断。   默认情况下,NAMEDATALEN为64,因此最大标识符长度为63   字节。如果这个限制有问题,可以通过改变它来提高   Src / include / pg_config_manual.h中的NAMEDATALEN常量。

所以除非你真的想要它并希望重新编译,否则63是标识符的硬限制

答案 1 :(得分:0)

您可以尝试使用自定义(和更短)名称创建索引:

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

由于您已经有name字段,只需更改索引名称:)