【问题标题】:What is the best practice when it comes to deleting a table in the Ruby on Rails migration?在 Ruby on Rails 迁移中删除表时,最佳实践是什么?
【发布时间】:2019-08-19 18:39:19
【问题描述】:

上周我创建了几张表,并被告知要删除它们。我应该这样做的建议方式如下所示:

示例表:

class CreateMenuTable < ActiveRecord::Migration
  def change
    create_table :menus do |t|
      t.string :name

      t.timestamps null: false
    end
  end
end
class CreateSpreeMenuRole < ActiveRecord::Migration
  def change
    create_table :menu_roles do |t|
      t.belongs_to :role, class_name: 'Role'
      t.belongs_to :menu, class_name: 'Menu'

      t.timestamps null: false
    end
  end
end

第 1 步。 bin/rake db:rollback STEP=6

第 2 步。 回滚后我必须注释掉那些表格

第 3 步。 bin/rake db:migrate

顺便说一句,在那之后我们仍然创建了多个表,这就是为什么我们仍然需要运行migrate

【问题讨论】:

  • 为什么不直接使用创建一个新的迁移,在其中使用drop_table 删除不再需要的表?如果您想保留更新的表格,回滚对我来说没有意义。
  • @spickermann 我不知道他们为什么推荐这个。我实际上正在考虑在一次迁移中删除表。所以回滚不是一个好方法?
  • 回滚并仅重新运行您想要保留的迁移将删除较新表中的所有数据。我认为这不是一个好主意...
  • 我不知道争论的人。我只是这里的小学生。但我知道这是错误的做法。谢谢。

标签: ruby-on-rails ruby migration rails-migrations


【解决方案1】:
  1. 生成迁移以删除这些表 rails g migration DropMenuTablerails g migration DropMenuRolesTable
  2. 将平板电脑放在任一处

迁移不可逆

class DropMenuTable < ActiveRecord::Migration
  def up
    drop_table :menus
  end

  def down
    fail ActiveRecord::IrreversibleMigration
  end
end
class DropMenuRolesTable < ActiveRecord::Migration
  def up
    drop_table :menu_roles
  end

  def down
    fail ActiveRecord::IrreversibleMigration
  end
end

迁移是可逆的

class DropMenuTable < ActiveRecord::Migration
  def change
    drop_table :menues do |t|
      t.string :name
      t.timestamps null: false
    end
  end
end
class DropMenuRolesTable < ActiveRecord::Migration
  def change
    drop_table :menu_roles do |t|
      t.belongs_to :role, class_name: 'Role'
      t.belongs_to :menu, class_name: 'Menu'
      t.timestamps null: false
    end
  end
end
  1. 运行rake db:migrate

【讨论】:

    【解决方案2】:

    如果只是注释掉迁移,会有不合适的提交。

    您还将删除其他表中的所有数据。

    因此,通过迁移删除表的最佳做法如下:

    class DropMenuTable < ActiveRecord::Migration
      def change
        drop_table :menus
      end
    end
    
    class DropMenuRolesTable < ActiveRecord::Migration
      def change
        drop_table :menu_roles
      end
    end
    

    【讨论】:

    • 请注意,这是一个不可逆转的迁移,该工具可能会对此大喊大叫。删除表格时,无法“取消删除”它。
    【解决方案3】:

    迁移让您可以随着时间推移改进数据库架构。

    当您的应用程序处于开发阶段时,回滚迁移并进行更改甚至删除它似乎很容易。但是,当您将代码部署到生产环境或与其他开发人员共享代码时,您不应该这样做。您的数据库可能会损坏并产生难以修复的错误。

    按照 spickermann 的建议,删除表的最佳方法是创建一个新的迁移和 drop_table

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2023-03-19
      • 2023-03-25
      相关资源
      最近更新 更多