加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何在从表中删除列后避免崩溃Rails应用程序?

发布时间:2020-12-17 01:43:02 所属栏目:百科 来源:网络整理
导读:问题 我刚刚了解到,我们目前在ActiveRecord迁移中删除列的做法是在实际删除列之前隐藏Rails列(通过丑陋的黑客,请参阅下面的详细信息). 这是因为Rails缓存了SHOW FULL FIELDS查询.如果我们不解决这个问题,那么(长时间运行的)迁移将删除该列,到那时,Rails将已
问题

我刚刚了解到,我们目前在ActiveRecord迁移中删除列的做法是在实际删除列之前隐藏Rails列(通过丑陋的黑客,请参阅下面的详细信息).

这是因为Rails缓存了SHOW FULL FIELDS查询.如果我们不解决这个问题,那么(长时间运行的)迁移将删除该列,到那时,Rails将已经缓存了这些字段.迁移完成并且列消失后,应用程序将随后崩溃,因为INSERT将因缓存而为不存在的列提供值.

使用像clear_table_cache这样的东西!迁移中没有用处,因为我们部署到N个服务器并仅在其中一个服务器上运行迁移.这将清除其中一个服务器上的缓存,但不是全部.

我们当前的解决方案(a.k.a.丑陋的黑客)

我们目前正在做的是在初始化程序中覆盖ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#columns并在运行迁移之前进行部署.

迁移完成后,我们删除重写的初始化程序并再次部署.

在这一点上,我无法相信我们是唯一遇到这个问题并且必须解决它的人.这个问题还有其他解决办法吗?

解决方法

Rails 5与ActiveRecord :: Base类有 added ignored_columns

Since some columns will appear or disappear at any moment,you want to make those columns invisible to AR for a while. Otherwise you could have some processes knowing about the columns and others who don’t.

这是一些示例代码:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读