Rails使用迁移删除旧模型

17

我有一堆Rails模型,现在想将它们重写为一个单一的模型,以简化我的代码并减少不必要的表格。

我想知道删除模型类和其表格的最佳方法是什么。我希望过去的迁移仍然能成功,但我不想留下空的模型。

我需要手动删除引用这些模型的旧迁移,然后再手动删除类文件吗?

请问有没有任何关于如何最好地实现此操作的提示?

7个回答

23

多合一解决方案。

运行以下命令:

rails destroy model ModelName
rails g migration DropTableModelName

前者将生成一个新的迁移文件,其应该看起来像这样:

class DropTableModelName < ActiveRecord::Migration
  def change
    drop_table :model_name
  end
end
现在运行db:migrate,然后你就完成了。

还有一点需要注意。我们需要通过 git checkout(或类似方法)来恢复 db/migrate/20181106030807_create_model_names.rb 文件,对吧? - Satoshi Suzuki
迁移文件应保持不变,不建议进行修改/删除/恢复。 - Lucio

15

如果您想完全摆脱一个模型及其表格,请执行以下操作:

rails destroy model Name

7
这不会生成一个remove_table的迁移,而是删除create这个迁移。因此,该模型仍将存在于schema.rb中... - Augustin Riedinger
1
这只会删除模型文件,数据库表将保留,应该使用迁移来删除它。 - tommybernaciak

8
这个问题有点过时了,但我刚刚做了:
rails destroy scaffold <ModelName> -p

“-p” 标志显示“模拟”输出,有助于查看将要发生的情况。去掉“-p”标志,结果将与输出匹配。这清理了整个 M-V-C 文件集合、测试、js 文件和原始迁移,没有问题。
我猜如果你是那种喜欢手动编辑迁移并在其中包含多个步骤的人,丢失原始迁移可能会破坏 db:setup,所以买家要小心。保持一个操作==一个迁移文件应该可以避免这种潜在的困难。

3

根据您所处的开发或生产阶段,您可能希望使用迁移将模型安全地移出以删除/备份数据等。然后,如bobbywilson0建议的那样,使用

script/destroy model

如果你使用rspec进行测试

script/destroy rspec_model

这将同时移除任何规范测试。
或者,您可以直接将它们拖到垃圾文件夹中。

3

你可以试试运行ruby script/destroy model命令,这会删除掉对应的模型和数据库迁移文件。


那后续迁移会往这个模型中添加数据如何处理呢?script/destroy 会搜索所有迁移文件并删除初始创建表的那一个吗? - brad
1
以后的迁移将需要它们自己的 script/destory migration migration_name。一个好的方法来思考它,是生成命令的撤销。因此,它也不会搜索修改同一模型的其他迁移。 - bobbywilson0
2
好的,那么所有这些的最终答案是我可以使用 script/destroy,但我还需要手动编辑可能包含对这些已删除模型的引用的任何迁移。非常感谢。 - brad

2
你可以在Rails指南中查看示例。但我建议,如果可能的话,你应该删除模型及所有对模型的引用。这样做可能会节省时间,因为你不需要在代码库中维护无效代码。

0
如果您更喜欢手动操作:
首先运行以下命令以确定要删除的迁移文件:

```

rake db:migrate:status

如果你对自己的命名方案有信心,可以随意使用grep -i

注意所有“将x添加到模型名称”和类似修改您的模型。这些可以使用以下方法删除:

rails d migration AddXToModelName

对于除了初始创建迁移之外的每个迁移都要这样做。以下命令将处理初始创建迁移和与模型相关联的文件:

rails d model ModelName

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