【问题标题】:Input string is longer than NAMEDATALEN-1 (63) Ruby on Rails 4输入字符串长于 NAMEDATALEN-1 (63) Ruby on Rails 4
【发布时间】:2014-04-23 08:43:11
【问题描述】:

我在 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

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

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'

这行导致问题:

rename_table :car_addition_translations, :available_car_addition_translations

我该如何解决这个问题?

【问题讨论】:

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


【解决方案1】:

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

很可能是索引名称达到了字符限制。这是因为 Rails 4 rename_table 也重命名了现有索引,并且自动生成的索引名称往往会变得很长。

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

使用rename_index 将您的索引重命名为不同于自动生成的名称​​之前调用rename_table。因为接下来的rename_table 将不再触及现有索引。

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

【讨论】:

  • 我可以添加改进吗:我在这个问题上遇到了一些细微的变化。第一个论点和第二个论点都可能导致这种情况。据我所知,这是由 PostgreSQL 试图读取索引名称并进行完整性检查引起的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 2019-06-20
  • 2020-12-19
  • 2011-11-16
相关资源
最近更新 更多