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