使用ghost和rails进行列删除

ttp71kqs  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(398)

我们在rails应用程序中使用github-ghost进行在线迁移。这样做的目的是将迁移与应用程序代码更改分离开来,同时避免在不影响站点性能的情况下通过rake任务运行的大型迁移需要停机。
这很好,只有一个例外:删除列。当我们删除一个列时,rails会变得混乱并开始抛出异常。原因是rails模式缓存。即使应用程序代码没有引用列(在运行ghost迁移之前必须满足的过程要求),rails仍然认为它在那里。所以这是默认的使用行为 SELECT * 在表上,它会尝试从(数据库迁移完成后)不再存在的列中获取数据。
我们正试图找到解决这个问题的办法,使我们能够实现上述两个目标。两种可能性是(1)在ghost迁移完成后重新启动rails服务器,或(2)在ghost迁移完成后清除rails模式缓存。这两种方法都是可行的,尽管它们限制了我们将在线迁移与应用程序代码更改完全解耦的能力,而且都有可能影响站点性能。
考虑到数据库和应用程序的大小,我认为我们不愿意考虑的另一个选择是关闭rails模式缓存。
有其他人解决过这个问题吗?我们有什么选择?

lp0sw83n

lp0sw83n1#

我在github问题页面上询问了ghost,并学到了一些应对这一挑战的方法:
对于rails 4,重写 ActiveRecord::Base.columns 要从有关模型的列数组中删除该列,请执行以下操作:

class User < ActiveRecord::Base
  def self.columns
    super.reject {|column| column.name == 'employee_email'}
  end
end

在Rails5中,可以使用 .ignored_columns :

class User < ApplicationRecord
  self.ignored_columns = %w(employee_email)
end

感谢这篇博客文章中的代码示例。
另一种方法是从相关关联中删除“急切加载”,这样rails模式缓存就不会像我的问题中所描述的那样发生干扰。
无论选择哪种选项,都必须在执行ghost迁移之前将其部署到rails应用程序。这样可以确保应用程序在不考虑列是否存在的情况下都能正常工作,这样就不需要在迁移完成后重新启动rails应用程序。

相关问题