Ruby on rails Rails:迁移中重命名列失败

Ruby on rails Rails:迁移中重命名列失败,ruby-on-rails,ruby-on-rails-5,Ruby On Rails,Ruby On Rails 5,我有一个简单的迁移失败:数据库不受影响,迁移后仍然包含旧列名 class RenameTypeToLicenseTypeInLicenses < ActiveRecord::Migration[5.1] def change rename_column :licenses, :type, :license_type end end 这是rails db:migrate的输出 igrating to RenameTypeToLicenseTypeInLicenses (20

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

class RenameTypeToLicenseTypeInLicenses < ActiveRecord::Migration[5.1]
  def change
    rename_column :licenses, :type, :license_type
  end
end
这是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 ($1) 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" = $1 LIMIT $2  [["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
如何重命名
类型

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

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 ($1) 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" = $1 LIMIT $2  [["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

我相信这个答案会帮助你:


type
是我们不应该使用的保留字之一。检查此处的其他保留字:

是的,我想知道ActiveRecord的迁移代码是否会尽力保持
类型
的完整性,前提是它当前用于单表继承;它忽略了您想要更改它的事实,因为它当前不是。您可以通过在目标模型中添加以下内容来保留类型列
self.heritation\u column=nil
self.heritation\u column='some\u other\u type\u name'
。通过这种方式,AR不会将类型列引用到STI(单表继承),谢谢,我知道这一点,但我更愿意更改列名。使用
type
仍然会从我们使用的JSONAPI::Resources gem中生成警告。您现有的type列是否包含一些数据?是的,其中包含数据(字符串)。根据您最近在文章中的编辑。在运行
remove\u column
迁移时,数据库中是否仍存在
type
列?(在
schema.rb
文件中可见)如果是,运行迁移时终端上是否有任何错误?感谢您的回答。你写的每件事之前都提到过:你的链接指向一个问题,但第一个答案包含的建议与Farhad Ajaz对我问题的评论相同。问题本身就提到了我问题的原因。
[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 ($1) 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" = $1 LIMIT $2  [["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