如何解决使用 Ruby on Rails 处理失败迁移的最佳策略
希望你们一切都好。
我从 Github 将我的一个旧项目(实时生产)克隆到运行 Big Sur 的新 MacBook。我想开发新功能和更新,但总是遇到一些迁移错误。
据我所知,我们不应删除任何迁移文件。那么修复这些错误的最佳做法是什么?
谢谢!
% 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:create
、db:schema:load
、db: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 举报,一经查实,本站将立刻删除。