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)
我怎么解决这个问题?
这是PostgreSQL的限制.在编译时,NAMEDATALEN常量定义标识符的最大长度.(默认情况下为64).如果不重新编译PostgreSQL就无法更改它.
很可能它是一个符合字符限制的索引名称.这是因为Rails 4 rename_table也重命名现有索引,而自动生成的索引名称往往会变得很长.
目前无法禁用索引重命名,但您可以绕过它:
用于在调用之前rename_index将索引重命名为与自动生成的名称不同的任何名称.因为接下来将不再触及现有索引.rename_tablerename_table
这可能很烦人,但无论如何你都无法保留自动生成的索引名称,只需在重命名表之前重命名它们.