awe*_*ndt 3 activerecord caching ruby-on-rails
我刚刚了解到,我们当前在ActiveRecord迁移中删除列的做法是在实际删除列之前隐藏Rails列(通过丑陋的黑客,请参阅下面的详细信息).
这是因为Rails缓存了SHOW FULL FIELDS
查询.如果我们不解决这个问题,那么(长时间运行的)迁移将删除该列,到那时,Rails将已经缓存了这些字段.迁移完成并且列消失后,应用程序将随后崩溃,因为INSERT
s将因缓存而为不存在的列提供值.
使用clear_table_cache!
迁移中的内容是没有用的,因为我们部署到N个服务器并仅在其中一个服务器上运行迁移.这将清除其中一个服务器上的缓存,但不是全部.
我们目前正在做的是覆盖ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#columns
初始化程序并在运行迁移之前进行部署.
迁移完成后,我们删除重写的初始化程序并再次部署.
在这一点上,我无法相信我们是唯一遇到这个问题并且必须解决它的人.这个问题还有其他解决办法吗?
Rails 5已添加ignored_columns
到ActiveRecord::Base
类中:
由于某些列会随时出现或消失,因此您希望将这些列暂时保留给AR.否则你可能会有一些进程知道列和其他没有.
这是一些示例代码:
class User < ApplicationRecord
self.ignored_columns = %w(employee_email)
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1161 次 |
最近记录: |