在对rename_table_migration执行重命名之后,如何在Rails中重命名原始迁移文件

6

我刚好在Rails中创建了一个查询(Query)模型,最近发现这是其中一个保留字..

我使用了一个新的迁移文件重命名了表格并将所有已创建的文件重命名(新模型的名称为Plot)。

问题:将原始迁移文件(20111228212521_create_queries.rb)重命名为20111228212521_create_plots.rb是否可行?

以及旧文件内部的所有内容:

class CreateQueries < ActiveRecord::Migration
 def change
   create_table :queries do |t|
    t.string :name
    t.text :content

    t.timestamps
    end
   end
 end

to

class CreatePlots < ActiveRecord::Migration
   def change
    create_table :plots do |t|
    t.string :name
    t.text :content

    t.timestamps
    end
   end
 end

我不想有太多的迁移文件,同时也担心在切换到生产环境时可能会出现一些错误。

4个回答

16

您可以更改迁移文件的名称,但必须执行以下几个步骤:

  1. 运行rake db:rollback以将查询表回滚。

  2. 现在更改迁移文件的名称,以及其中的内容。

  3. 更改任何可能使用该表的模型的名称。

  4. 运行rake db:migrate


6
回滚也意味着你将删除所有数据,直到最后一个回滚版本。这对开发工作来说是有效的,但如果你使用生产数据库,这并不可取。 - Berimbolo
即使在开发过程中,我也需要放弃很多已经完成的工作,因为我创建了那个迁移。 - aerijman

2

简单回答就是创建另一个迁移文件。

迁移文件旨在跟踪数据库的每一次更改。因此,建议您在单独的文件中进行小的一次性更改。我不能代表你的情况说话,但在我的情况下,如果我犯了这样的错误,我只需创建一个新的迁移文件,并且不将旧的迁移文件提交到源代码控制中。这样,错误的更改仅存在于我的本地数据库中,而不会进入生产/开发/预发布环境。


我不理解这个答案。要创建另一个迁移文件,但是要用一个新的名称吗?我有同样的问题,想要使用相同的名称。 - aerijman

1
除了回滚之外,特别是在生产环境中需要重命名早期迁移时,您现在可以在 Rails 4 中创建一个新的迁移来重命名它。

  1. $rails generate migration RenamesFooBarr

然后在新迁移的方法中添加以下内容:

rename_table :old_migration_name, :new_migration name

like this:

class RenamesFooBar < ActiveRecord::Migration
   def change
       rename_table :old_foo_bar_name, :new_foo_bar_name
   end
end

这将有效地处理所有的索引,包括向上和向下,因为ActiveRecord识别rename_table
来源: http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

我正在使用Rails 5.2,但rails generate...不是一个选项。 - aerijman

0

简单来说,按照以下步骤操作:

  1. 回滚该查询的迁移。例如: rake db:rollback
  2. 更改迁移文件、类名和其内容。
  3. 最后,迁移数据库。例如: rake db:migrate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接