Rails: 重命名迁移中的列失败

Rails: Renaming column in migration fails

我有一个简单的迁移失败:数据库不受影响,迁移后它仍然包含旧的列名。

class RenameTypeToLicenseTypeInLicenses < ActiveRecord::Migration[5.1]
  def change
    rename_column :licenses, :type, :license_type
  end
end

由于此错误,有必要将 type 重命名为 license_type

The single-table inheritance mechanism failed to locate the subclass: 'creative commons'. This error is raised because the column 'type' is reserved for storing the class in case of inheritance. Please rename this column if you didn't intend it to be used for storing the inheritance class or overwrite License.inheritance_column to use another column for that information.

这是rails db:migrate

的输出
igrating to RenameTypeToLicenseTypeInLicenses (20210422110849)
   (0.2ms)  BEGIN
== 20210422110849 RenameTypeToLicenseTypeInLicenses: migrating ================
== 20210422110849 RenameTypeToLicenseTypeInLicenses: migrated (0.0000s) =======

  SQL (0.9ms)  INSERT INTO "schema_migrations" ("version") VALUES () RETURNING "version"  [["version", "20210422110849"]]
   (1.4ms)  COMMIT
  ActiveRecord::InternalMetadata Load (0.5ms)  SELECT  "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" =  LIMIT   [["key", "environment"], ["LIMIT", 1]]
   (0.3ms)  BEGIN
   (0.3ms)  COMMIT
   (0.4ms)  SELECT pg_advisory_unlock(2195010657070977375)
   (0.6ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC

如何重命名 type 列?

编辑: 由于table中的数据很少,我尝试了另一种方法:

remove_column :licenses, :type, :string
add_column :licenses, :license_type, :string

也不行。输出是

[NAME COLLISION] `type` is a reserved key in LicenseResource.
   (0.7ms)  SELECT pg_try_advisory_lock(2195010657070977375);
   (1.3ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Migrating to ChangeTypeToLicenseTypeFromLicenses (20210422122638)
   (0.5ms)  BEGIN
== 20210422122638 ChangeTypeToLicenseTypeFromLicenses: migrating ==============
== 20210422122638 ChangeTypeToLicenseTypeFromLicenses: migrated (0.0000s) =====

  SQL (1.0ms)  INSERT INTO "schema_migrations" ("version") VALUES () RETURNING "version"  [["version", "20210422122638"]]
   (4.6ms)  COMMIT
  ActiveRecord::InternalMetadata Load (0.4ms)  SELECT  "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" =  LIMIT   [["key", "environment"], ["LIMIT", 1]]
   (0.4ms)  BEGIN
   (0.4ms)  COMMIT
   (0.6ms)  SELECT pg_advisory_unlock(2195010657070977375)
   (0.9ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC

我相信这个答案应该对您有所帮助:issue with column name 'type' in rails 3

type 是我们不应该使用的保留字之一。在这里检查其他保留字:https://riptutorial.com/ruby-on-rails/example/32446/reserved-word-list

是的,我想知道 ActiveRecord 的迁移代码是否会尽力保持 type 完整,前提是它当前用于单个 table 继承;它没有注意到您想更改它的事实,因为它目前 不是

可能有一种惯用的 Rails 方式告诉迁移您正在做的事情很好,但老实说,我很想降到 SQL 级别,从而绕过 Rails' 错误保护:

class RenameTypeToLicenseTypeInLicenses < ActiveRecord::Migration[5.1]
  def up
    execute <<~SQL
      ALTER TABLE licenses RENAME COLUMN type TO license_type;
    SQL
  end

  def down
    execute <<~SQL
      ALTER TABLE licenses RENAME COLUMN license_type TO type;
    SQL
  end
end

由于您没有使用迁移命令,因此您必须为迁移的两个方向提供单独的 up/down 代码。