Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 我的Rails模式更改会删除数据吗?_Ruby On Rails_Ruby On Rails 3_Git_Activerecord_Migration - Fatal编程技术网

Ruby on rails 我的Rails模式更改会删除数据吗?

Ruby on rails 我的Rails模式更改会删除数据吗?,ruby-on-rails,ruby-on-rails-3,git,activerecord,migration,Ruby On Rails,Ruby On Rails 3,Git,Activerecord,Migration,我猜这是个奇怪的问题。我将在下面立即解释这个问题,然后为那些感兴趣的人提供解释我如何来到这里的背景 问题: 由于迁移,我的架构处于这样一种状态,它将我标记为同时删除和添加了相同的列。换句话说,当我diff schema.rb时,我得到了这个结果: - t.integer "cut_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false -

我猜这是个奇怪的问题。我将在下面立即解释这个问题,然后为那些感兴趣的人提供解释我如何来到这里的背景

问题:

由于迁移,我的架构处于这样一种状态,它将我标记为同时删除和添加了相同的列。换句话说,当我diff schema.rb时,我得到了这个结果:

-    t.integer  "cut_id"
-    t.datetime "created_at",  :null => false
-    t.datetime "updated_at",  :null => false
-    t.integer  "animal_id"
+    t.datetime "created_at",                     :null => false
+    t.datetime "updated_at",                     :null => false
+    t.integer  "animal_id"
+    t.integer  "cut_id"
令人担忧的是,虽然这不会在net中添加/删除列,但如果我将此代码推送到生产环境并运行迁移,它将从本质上清除现有数据,即使它不会删除net中的任何列

是这样吗?有人知道DB是否会删除然后添加这四列,还是意识到没有变化?如果它将删除它们,有人能想出一种方法来修复此问题并在删除之前保存数据以重新插入吗?我不介意删除数据和替换数据之间的延迟时间

我是如何来到这里的:

基本上,我在本地进行了一系列的更改,包括多次迁移,然后才意识到我删除了将所有数据迁移到新表所需的一些列,因为我很匆忙,而且是个白痴

幸运的是,这只是本地的。不幸的是,我只是做了一个git reset HEAD^来放弃我的工作,但即使迁移已经消失,模式仍然顽固地处于错误迁移后的状态,无法重置或做任何事情。所以我经历了尝试恢复旧迁移并回滚它们的整个过程,一半成功,然后编写其他迁移以完全回滚我半回滚的更改


巨大的混乱,仅仅是这一个问题的结果。有没有可能这根本不是问题,而且我可以轻松部署/睡眠?

因此这里有两个不同的问题-迁移和模式。如果运行删除列的迁移,那么这些列以及它们包含的任何数据都将被删除。因此,您可能需要编辑迁移,并删除或编辑删除要保留的列的任何迁移。要非常非常小心,确保任何迁移都不会删除要保留的数据

除非使用rake任务(rake db:schema:load)显式加载模式,否则schema.rb本质上与生产数据库无关。这会删除您的数据,但一般来说,您不会对生产系统执行此操作。

添加的(
+
)和删除的(
-
)部分是相同的,只是顺序不同而已。因此,只要不假设表中列的顺序,就可以了。