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

Posted

技术标签:

【中文标题】在 Rails 3 中删除表和删除模型的最佳方法是啥?【英文标题】:What is the best way to drop a table & remove a model in Rails 3?在 Rails 3 中删除表和删除模型的最佳方法是什么? 【发布时间】:2013-03-16 21:49:35 【问题描述】:

我的应用程序中不再需要模型和表格,我可以将它们留在那里,但我想删除它们以保持整洁。

我正在尝试找出最好的方法来删除它们,而不会弄乱我的 migrationsdb/schema.rb 文件以及它可能产生的任何副作用在我的生产环境中,我的应用程序在 Heroku 上。我在本地机器和 heroku 上都使用 PostgreSQL。

到目前为止,我已经找到了两种方法来做到这一点,但不确定哪种是最好的方法/rails 方式?

方法一

我想过只是进入我的数据库并删除表然后销毁模型。

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

& 然后在终端中:

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

这似乎是最好的方法,但是旧的迁移文件会发生什么?每次我运行 rake db:migrate 时,它​​们是否会保留并更新 db/schema,只会被 db/migrate/timestamp_drop_tablename 覆盖?

我很高兴尝试第二种方法,但希望有经验的人参与并告诉我这样做的方法。

【问题讨论】:

有没有办法自动生成“down”部分 【参考方案1】:

第二种方法是处理此问题的理想方法:您的迁移文件旨在表示您的数据库随时间发生的变化。旧的迁移文件将保留在您的项目中(以防万一,假设您想回滚到旧版本),但 Rails 不会在您 rake db:migrate 时运行它们,因为它知道它们已经运行(基于数据在数据库的 schema_migrations 表中)。

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

对您的代码进行一个小调整:您的迁移文件应该在up 方法中删除表,并在理想情况下在down 方法中重新创建它。 “up”表示你的迁移及时丢弃表向前移动,如果迁移回滚,就会运行down方法。

【讨论】:

感谢丹的解释,我回家后要试试这个。我按照建议更新了迁移文件问题中的代码,您介意查看一下吗,这是我应该在 def down 方法中添加的内容吗? 是的,完全正确。这样,如果出现问题,您可以rake db:rollback 并最终得到与以前相同的数据库结构。 我正在尝试销毁 Rails 4.2.4 中的模型。一旦我运行 rails destroy model,我就无法运行 rake db:migrate。我一直看到 NameError:未初始化的常量用户。我错过了什么?【参考方案2】:

我知道这是一个旧线程。通常,您不仅要删除模型,还要删除与该模型关联的路由、控制器和视图。为此,请运行这些

rails g migration DropYourModel
rails destroy scaffold YourModelName

将您的迁移文件编辑为drop_table,然后运行

rake db:migrate

如果模型恰好在命名空间中定义,例如admins,请将第一个命令替换为

rails destroy scaffold admins/YourModelName

【讨论】:

同意,这是在 rails 4 中处理它的正确方法。但您可能希望先生成迁移,因为如果删除模型,第二个命令似乎不会自动添加 drop table。跨度> 小心destroy scaffold 因为它会删除最初设置表的迁移文件,这将破坏以后对该表进行的任何迁移,所以如果项目是从头开始设置的迁移不起作用。

以上是关于在 Rails 3 中删除表和删除模型的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

删除 rails 中的模型(与“rails g model Title...”相反)

如何在Rails 5中删除模型时删除模型的所有关联

删除具有关系的相关列的最佳方法

Rails Scaffold 方法的最佳实践

Rails 4+ 最佳实践:删除父项同时保留子项

在 Rails 中测试模型的最佳实践是啥?