微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Ruby on Rails 处理失败迁移的最佳策略

如何解决使用 Ruby on Rails 处理失败迁移的最佳策略

希望你们一切都好。

我从 Github 将我的一个旧项目(实时生产)克隆到运行 Big Sur 的新 MacBook。我想开发新功能和更新,但总是遇到一些迁移错误

据我所知,我们不应删除任何迁移文件。那么修复这些错误的最佳做法是什么?

  • 我是否应该删除、编辑导致问题的迁移文件
  • 我应该删除相关的 gems 和迁移文件并重新安装吗?
  • 还有其他建议吗?

谢谢!

  % bin/rails db:migrate RAILS_ENV=development
    ** Invoke db:migrate (first_time)
    ** Invoke environment (first_time)
    ** Execute environment
    ** Invoke db:load_config (first_time)
    ** Execute db:load_config
    ** Execute db:migrate
    == 20171118122416 AddTaggingsCounterCachetoTags: migrating ====================
    -- add_column(:tags,:taggings_count,:integer,{:default=>0})
       -> 0.0521s
    rails aborted!
    StandardError: An error has occurred,this and all later migrations canceled:
    
    uninitialized constant AddTaggingsCounterCachetoTags::ActsAsTaggableOn

解决方法

不,您不应该删除迁移,根据 rails 自己的建议,在具有现有迁移的旧项目上创建新数据库时,您可能最好运行 bin/rails db:schema:load

https://github.com/rails/rails/blob/main/actionmailbox/test/dummy/db/schema.rb#L5-L9

此文件是 Rails 在运行 bin/rails db:schema:load 时用来定义架构的源文件。创建新数据库时,bin/rails db:schema:load 倾向于 比运行所有的程序更快,并且可能更不容易出错 从头开始迁移。如果这些,旧的迁移可能无法正确应用 迁移使用外部依赖项或应用程序代码。

请注意,rails db:setup 执行 db:createdb:schema:loaddb:seed,这在设置项目时很有用

,

一般情况下,只需使用 db:schema:load

通常最好的解决方案是运行 bin/rails db:schema:load,正如@Mshka 所说。

但为了获得一些潜在的灵感,这里有一个案例研究,其中一个旧的迁移文件已被删除(否决),我恢复了它,以便我可以再次运行 db:migrate...>

案例研究:恢复已删除的迁移

在此示例中,一位同事无缘无故删除了旧迁移(可能是意外),因此 db:migrate 不再在开发中处理空数据库。然而,在从旧提交中追踪已删除的迁移文件后,简单地重新添加该迁移文件会带来一个新问题:迁移现在在生产中失败,因为迁移添加的列已经存在于生产中。在我的案例中效果很好的解决方案是修改旧的迁移

class AddContigFileidToSubmissions < ActiveRecord::Migration[4.2]
  def change
    add_column :submissions,:contig_fileid,:string
  end
end

class AddContigFileidToSubmissions < ActiveRecord::Migration[4.2]
  def self.up
    if !column_exists?(:submissions,:contig_fileid)
      add_column :submissions,:string
    end
  end

  def self.down
    remove_column :submissions,:contig_fileid
  end
end

这允许 db:migrate 再次在开发中的空数据库上工作(现在正确添加了列),并且在部署到生产时迁移继续工作(Rails 会发现该列已经存在在数据库中,并且不做任何更改)。

因此,如果您发现之前的提交错误地损坏了旧迁移,那么修复损坏可能是一个方便的解决方案。但请使用您的判断。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。