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

Posted

技术标签:

【中文标题】如何从现有迁移文件中删除脚本 rails【英文标题】:How to remove a script from a existing migration file rails 【发布时间】:2019-06-30 02:06:00 【问题描述】:

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

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

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

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

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

【问题讨论】:

你为什么要这么做? 如果其他用户或在您部署时您可能会发现带有 activate_at 列的 nil 值。 @Nithin 他先设置了它,但现在他的要求发生了变化,或者他用所需的逻辑得到了纠正,所以他想知道最优雅的方法。 【参考方案1】:

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

所以帮助您的决策过程

如果您在团队中工作,并且团队成员已经检查了您的代码并运行了迁移,请使用新的迁移来修复它 如果您已部署到您必须修复的任何服务器(测试/暂存/生产),请添加新的迁移来修复它 如果您还没有将代码推送到master(所有代码都保留在本地),请随意调整迁移:P

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于如何从现有迁移文件中删除脚本 rails的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails:如何使用迁移向现有列添加非空约束?

如何从现有的迁移文件的轨道删除脚本

在 rails upgrade 迁移条目从模式迁移表中删除后

Rails迁移以将主键添加到现有表

Laravel 迁移:从现有外键中删除 onDelete('cascade')

如何在 Rails 迁移中将列(包含内容)移动到另一个表?