放桌子的最佳方法是什么?删除Rails 3中的模型?

时间:2013-03-26 22:05:13

标签: ruby-on-rails-3 heroku rails-migrations rails-models

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

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

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

方法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

&安培;然后在终端:

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更新db / shema:只迁移db / migrate / timestamp_drop_tablename?

我很高兴尝试使用第二种方法,但希望某位有经验的人能够权衡这种方法。告诉我rails的方法。

2 个答案:

答案 0 :(得分:32)

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

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

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

答案 1 :(得分:13)

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

rails g migration DropYourModel
rails destroy scaffold YourModelName

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

rake db:migrate

如果模型恰好在命名空间中定义,例如admins,则用

替换第一个命令
rails destroy scaffold admins/YourModelName
相关问题