在rails上处理ruby时坚持使用git,即使在还原提交后也无法撤消创建的表(模型)

时间:2018-06-16 13:53:28

标签: ruby-on-rails git model commit revert

  1. 首先我有我的应用程序而且我在掌握,我创建了一个名为“one”的分支,然后我切换到它。
  2. 我写了一些代码然后提交了它,然后我创建了一个名为“category”的模型并提交了它
  3. 现在我不希望这个表不再存在,所以我想恢复旧的提交。
  4. 我写了“git log”,当我没有创建类别表时,我得到了我的旧提交的ssh,然后我从一个旧提交创建了一个新分支,新分支称为“两个”,然后我切换到“两个”分支
  5. 这意味着,现在在名为“two”的新分支上,我没有创建类别模型,因为这个分支是从分支“one”的旧提交创建的,其中没有创建类别模型
  6. 但是我发现很奇怪,当在sublime文本上打开应用程序时,没有称为类别的模型,并且没有针对称为类别的模型的迁移.......当尝试查看数据库时使用“db browser for sqlite”的应用程序,我仍然看到类别模型即使在刷新后仍然存在,并且当尝试在分支“二”上创建类别模型并进行迁移时,会出现一个错误,指出类别模型已经存在... 。
  7. 那怎么会发生这种情况,你知道有什么方法可以在提交中恢复并完全删除之前创建的表吗?

3 个答案:

答案 0 :(得分:1)

即使您删除了迁移文件,表格也已创建。因此,您可以创建迁移以删除表,也可以使用当前架构重新创建数据库,而当前架构没有类别迁移。

原因是 - 一旦迁移运行,就会创建表。无论应用程序中的文件是什么,它都将保留在那里,直到它被删除或更改为止。因此,您必须创建一个迁移以删除它,然后在创建它之后运行它。

创建迁移

rails g migration drop_category_table

文件内

def change
  drop_table :category
end

答案 1 :(得分:1)

如果使用git rollbacks无法解决这个问题,我建议通过迁移删除表。在您的情况下,您可以执行以下操作:

在终端/命令中:rails g migration DropCategoryTable

class DropCategoryTable < ActiveRecord::Migration
  def up
    drop_table :category
  end

  def down
    # recreate table logic here
  end
end

然后返回终端/命令:rails db:migrate

答案 2 :(得分:0)

您的数据库是应用程序的独立实体,因此它的状态不是版本控制或git repo的一部分...不存在巧妙的钩子来帮助您在还原提交时还原数据库,因为还原提交将仅删除模型和迁移文件,而不删除数据库本身中的表

因此,在还原提交之前,您必须回滚数据库迁移。

rake db:rollback

在git恢复之前。

结论:要删除表格,您有两个选择之一

第一选项

“回滚以从数据库+ git日志中删除模型,以获取您拥有的所有git版本的列表,然后选择其中一个+检出该git的较早版本并创建一个分支,该分支将删除左侧的迁移和模型删除模型的文件”

rake db:rollback
git log
git checkout -b old-state 0d1d7fc32

第二个选项

“回滚以删除模型+ Rails销毁以删除左侧的迁移和模型文件,而无需检出已删除文件的旧版git”

  rake db:rollback
  rails destroy model <model_name>