Rubocop 的建议是好的,但我认为它不是导致此错误的原因。(它提到的“风险”是指对高流量表的锁定,这会影响生产流量。因此,这不会在测试环境中导致错误)
您可以通过执行 RAILS_ENV=test bin/rake db:drop db:create db:migrate(即从头开始迁移数据库,并启用 locations 插件)在本地重现相同的错误。
我怀疑问题在于您在迁移中调用 Rake 任务。在核心代码中,我们通常避免在迁移中运行任何类型的应用程序代码,因为这可能会产生奇怪的副作用。最好坚持使用纯 SQL。
在这种情况下,我的假设是 ActiveRecord 模式缓存会在迁移早期被填充(当 topics.off_topic_count 仍然存在时)。然后,当您的 rake 任务运行时,它将使用旧的模式缓存运行,因此 ActiveRecord 会尝试加载已不存在的列。
您可以通过在调用 rake 任务之前添加 ActiveRecord::Base.clear_cache! 来缓解此问题……但不要将其视为建议
。最好的办法是完全避免调用 rake 任务。如果您需要在数据库中操作某些内容,请在迁移中使用纯 SQL。