如何从现有迁移文件中删除脚本 rails

How to remove a script from a existing migration file rails

我从git中提取了新的变化,在这个新的变化中有一个迁移文件,

def change
  add_column :users, :activated_at, :datetime
  User.all.each do |user|
   user.update(activated_at: user.updated_at)
 end    
end

现在通常如果我想撤消迁移,即删除列说 activated_at 我必须 运行 另一个迁移才能这样做很好

但如果我只想删除脚本,即 user.update(activated_at: user.updated_at),我是否必须创建另一个迁移,或者我只是从迁移中删除脚本。

注意:我不想删除 activated_at 列,我只想删除脚本

您可以删除代码并在 master 分支中提交。

对于此迁移所在的系统 运行,您可以 运行 rake task 到 运行 任何您想回滚的内容(即将 activated_on 设置为零)。或者您可以从 rails 控制台 运行 将其设置为零。

对于您将克隆和创建数据库以及 运行 迁移的新系统,它不会在您删除代码时与脚本联系。

我的回答有点微妙。简而言之,你问:你能改变已经 运行 的迁移吗?一般来说,我会反对它。在您的情况下,它还取决于 activated_at 字段必须发生的情况,我可以想象它只会在用户 "activated" 时设置(无论这在您的应用程序上下文中可能意味着什么)。那么在那种情况下:将其设置为 updated_at 是错误的,必须是 "un-set"?或者以不同的方式设置?因此无论如何都需要迁移。或者,也可能:迁移尚未 运行 例如您的生产服务器和 运行 像这样进行迁移将很难以好的方式撤消(在这种情况下很简单 --set activated-at 再次为 nil),然后一定要调整迁移、提交和部署后,它将 运行 一个 更好的 迁移。但是......你将不得不手动restore/fix迁移所有机器上的情况did 运行(你的机器,你的同事,登台测试平台?。 ..)

所以帮助你的决策过程

  • 如果您在团队中工作,并且队友已经检查了您的代码和 运行 迁移,请使用新的迁移来修复它
  • 如果您已经部署到任何您必须修复的服务器 (testing/staging/production),请添加一个新的迁移来修复它
  • 如果您没有将代码推送到 master(所有代码都保留在本地),请随意调整迁移 :P

顺便说一句:我看到开发人员非常渴望在 git 中只有 "perfect" 代码,他们将使用所有选项 git 提供清理代码:去回顾历史,壁球提交,我不得不承认结果非常清楚。这是非常诱人和可以理解的,但恕我直言,我们丢失了信息(我们是如何到达这里的,为什么?)。同样,进行干净和最少的迁移很诱人,但我个人认为 git 和您的迁移 "show" 对问题领域的理解不断加深并没有什么可耻的。我认为这是它被称为 "developing" 的原因之一:构建软件是一个非常迭代的过程,它在不断变化,您的代码 (git/history) 和迁移可以反映这一点。如果最后一部分过于元化和主观,我深表歉意。