在Rails 3中删除表格和删除模型的最佳方法是什么?

我有一个模型和桌子,我不再需要在我的应用程序,我可以离开他们在那里,但我想删除他们保持干净整洁。

我试图找出最好的方法来消除他们与我的migrationsdb / schema.rb文件和任何副作用可能有我的生产环境,我的应用程序在Heroku上。 我在我的本地机器和heroku上使用PostgreSQL。

到目前为止,我已经find了两种方法来做到这一点,但不知道哪个是最好的方法/轨道方式?

方法1

我想到了进入我的数据库,放下桌子,然后摧毁模型。

rails db DROP TABLE table_name \q rails destroy model model_name 

如果我这样做,这个模型/表格的迁移会发生什么? 我对这个模型有两个迁移,一个是timestamp_create_modelname和一个add_attribute_to_table名字。

这个方法也会更新db / schema.rb文件吗?

当我将应用程序推到Heroku时,我怀疑模型会被移除,但是表格将保留在原位,是否有一个heroku命令来删除表格。

方法二

我读到的另一种方法是生成一个新的迁移,以删除表,然后摧毁模型。

 rails generate migration drop_tablename 

然后更新下面的文件:

db / migrate / timestamp_drop_tablename (在下面Dan Wich的回答中更新)

 class DropTablename < ActiveRecord::Migration def up drop_table :tablename end def down create_table :tablename do |t| t.string :table_column t.references :anothertable t.timestamps end add_index :tablenames, :anothertable_id end end 

然后在terminal:

 rake db:migrate rails destroy model model_name rake db:migrate git add . git commit -m "removed table/model_name" git push heroku master heroku run rake db:migrate heroku restart 

这似乎是最好的方法,但旧的迁移文件会发生什么? 他们会保持更新db / shema每次运行rake db:迁移只能被db / migrate / timestamp_drop_tablename覆盖吗?

我很乐意尝试第二种方法,但希望有人与有经验的人来衡量和告诉我这样做的方式。

第二种方法是处理这个问题的理想方法:你的迁移文件意味着你的数据库随着时间的推移而变化。 旧的迁移文件将保留在您的项目中(假设您想要回滚到旧版本),但是rake db:migrate在您运行rake db:migrate时不会运行它们rake db:migrate因为它知道它们已经运行(基于数据库的schema_migrations表中的数据)。

您的schema.rb将只更新一次,以反映您的数据库不再包含该表。

对你的代码做一些小小的调整:你的迁移文件应该在up方法中删除表,最好在down方法中重新创build它。 “向上”表示您的迁移将使该表及时向前移动,如果迁移回滚,则将运行down方法。

我知道这是一个古老的线索。 多数情况下,您不仅要移除模型,还要移除与该模型相关的路线,控制器和视图。 要做到这一点,运行这些

 rails g migration DropYourModel rails destroy scaffold YourModelName 

编辑你的迁移文件到drop_table然后运行

 rake db:migrate 

如果模型恰好在命名空间中定义,例如admins ,请使用replace第一个命令

 rails destroy scaffold admins/YourModelName