55

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

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

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

方法一

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

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 覆盖?

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

4

2 回答 2

32

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

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

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

于 2013-03-26T22:16:12.353 回答
13

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

rails g migration DropYourModel
rails destroy scaffold YourModelName

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

rake db:migrate

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

rails destroy scaffold admins/YourModelName
于 2015-05-29T14:27:42.603 回答