Ruby on rails 在Rails中重新创建表

Ruby on rails 在Rails中重新创建表,ruby-on-rails,ruby,postgresql,Ruby On Rails,Ruby,Postgresql,我正在使用Rails和Postgres。我目前创建了一个Like表。我需要删除此表并重新创建它。这是我到目前为止所做的 1) 将create_likes迁移文件重命名为create_likes\u old,这样迁移中的文件名就不会冲突 2) 将迁移中的表名从create\u table:likes更改为create\u table:likes\u old 3) 生成新的create_likes迁移,创建一个名为Like的表 当前,我在运行rake db时遇到了以下问题:migrate: PG::

我正在使用Rails和Postgres。我目前创建了一个Like表。我需要删除此表并重新创建它。这是我到目前为止所做的

1) 将
create_likes
迁移文件重命名为
create_likes\u old
,这样迁移中的文件名就不会冲突

2) 将迁移中的表名从
create\u table:likes
更改为
create\u table:likes\u old

3) 生成新的
create_likes
迁移,创建一个名为Like的表

当前,我在运行rake db时遇到了以下问题:migrate:

PG::DuplicateTable: ERROR:  relation "likes" already exists

这使得like表似乎从未重命名为LikeOld。出了什么问题以及如何解决此问题?

旧迁移在您更改其内容时不会运行,您不应该重命名它们。即使它们确实运行了,将
create_table:likes
更改为
create_table:old_likes
也不可能更改现有表的名称。这不是
create\u table
所做的。在最好的情况下,重新运行该迁移将导致创建一个名为
old_likes
的新表,该表没有任何内容,而旧的
likes
表不受影响。实际上,重新运行该迁移将失败,因为它将首先尝试撤消迁移,删除尚不存在的表
old\u likes

您需要做的是创建一个名为
rename\u likes\u to\u old\u likes
的新迁移,该迁移实际上使用重命名表。然后,要么:


  • 完全删除旧迁移,这样您就可以使用相同的名称引入新迁移

  • 创建一个具有唯一名称的新迁移,例如
    create\u new\u likes\u table
    或类似名称,并在那里介绍您的新表

此表已存在于数据库中。您需要删除它或重命名它。或者不重命名任何东西,但在新迁移中删除旧表,然后重新创建它。第二种方式要好得多,因为它对未来是安全的。我发誓我读过一个Stackoverflow的答案,解释了为什么你可以做这样的事情,它有30+分。我希望我能找到它。我真的相信你。有趣的是,我最初的想法曾一度奏效,但由于git问题,我丢失了一两个文件,把一切都搞砸了。我很高兴现在已经解决了这个问题。“这样您就可以使用相同的名称引入新的迁移”-迁移名称包括时间戳,因此不需要删除以前的迁移,也不需要创建唯一的名称。@jason328可能缺少上下文,但我可以绝对肯定地告诉您,除非您使用
rake db:migrate:redo VERSION=
显式地重新运行该迁移,否则更改旧迁移将完全无效。如果您尝试为您描述的迁移运行该迁移,它将失败,因为它将首先尝试删除一个名为
old\u likes
的表,它还不存在。@SergioTulentsev否,数字后面的字符串必须是唯一的。您不能有名为
001\u stuff.rb
002\u stuff.rb
的迁移,
\u stuff
必须是唯一的。我请您自己试试。@SergioTulentsev问题是迁移名称直接映射到它定义的类
create\u stuff
必须定义一个名为
CreateStuff
的迁移类。两个同名的迁移必然会定义同一个类,这会让事情变得一团糟。后一个类将破坏前一个类的方法,或者可能会导致第一个类定义
up/down
,第二个类定义
change
产生一些奇怪的未定义行为。Rails通过在迁移名称上强制唯一性来避免这种混乱。