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

标签 ruby-on-rails caching activerecord

问题

我刚刚了解到,我们当前在 ActiveRecord 迁移中删除列的做法是在实际删除该列之前从 Rails 中隐藏该列(通过丑陋的 hack,详情见下文)。

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

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

我们目前的解决方案(又名丑陋的黑客)

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

迁移完成后,我们删除覆盖初始化程序并再次部署。

在这一点上,我不敢相信我们是唯一遇到这个问题并且必须解决它的人。 这个问题还有其他解决方案吗?

最佳答案

Rails 5 有 added ignored_columns ActiveRecord::Base类(class):

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

关于ruby-on-rails - 从表中删除列后如何避免Rails应用程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32581223/

相关文章:

ruby-on-rails-3 - read_attribute_before_type_cast 似乎不适用于序列化 :

ruby-on-rails - 如何让 puma 将日志发送到标准输出

ruby-on-rails - 示波器的真正好处是什么

caching - 如何获取ServiceWorker缓存中元素的大小和/或数量?

ruby - 带有 Ruby 脚本的 ActiveRecord,没有 Rails,连接池超时

sql - 根据聚合的关联模型字段对条目进行分组

ruby-on-rails - 插件中的 Rails ActiveRecord::Observer

ruby-on-rails - 如何从Activerecord查询结果集中删除项目?

java - Java to Kotlin构造函数方法

php - 配置 Varnish 后如何将网页缓存 2 分钟。 (Ubuntu 14.04,Apache,PHP)