输入字符串比NAMEDATALEN-1(63)Ruby on Rails 4长

Mat*_*ski 3 ruby postgresql ruby-on-rails ruby-on-rails-4

我在Ruby on Rails应用程序中重命名表时遇到问题.我有CarAddition模型,现在我必须将它重命名为AvailableCarAddition.所以我写迁移:

class RenameCarAdditionsToAvailableCarAdditions < ActiveRecord::Migration
  def change
    rename_table :car_additions, :available_car_additions
    rename_column :car_additions_assignments, :car_addition_id, :available_car_addition_id
    rename_column :car_addition_translations, :car_addition_id, :available_car_addition_id
    rename_table :car_addition_translations, :available_car_addition_translations
  end
end
Run Code Online (Sandbox Code Playgroud)

当我尝试运行它时,我有以下错误:

Input string is longer than NAMEDATALEN-1 (63)/home/mateusz/.rvm/gems/ruby-2.1.1@rentcar/gems/activerecord-4.0.4/lib/active_record/connection_adapters/postgresql/quoting.rb:154:in `quote_ident'
Run Code Online (Sandbox Code Playgroud)

此行导致问题:

rename_table :car_addition_translations, :available_car_addition_translations
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

Dan*_*ski 9

这是PostgreSQL的限制.在编译时,NAMEDATALEN常量定义标识符的最大长度.(默认情况下为64).如果不重新编译PostgreSQL就无法更改它.

很可能它是一个符合字符限制的索引名称.这是因为Rails 4 rename_table也重命名现有索引,而自动生成的索引名称往往会变得很长.

目前无法禁用索引重命名,但您可以绕过它:

用于调用之前rename_index将索引重命名为与自动生成的名称不同的任何名称.因为接下来将不再触及现有索引.rename_tablerename_table

这可能很烦人,但无论如何你都无法保留自动生成的索引名称,只需在重命名表之前重命名它们.