我正在使用ActiveRecord 3.0(没有rails)构建命令行应用程序。如何清除ActiveRecord维护的查询缓存?
答案 0 :(得分:30)
第一个近似值:
ActiveRecord::Base.connection.query_cache.clear
答案 1 :(得分:2)
查看http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/QueryCache.html
中的方法clear_query_cache
答案 2 :(得分:1)
如果你只想暂时这样做,你可以像这样使用ActiveRecord::Base.uncached
:
::ActiveRecord::Base.uncached { User.order('random()').limit(3) }
答案 3 :(得分:0)
通常,当您看到数据库查询的缓存时,您的数据库正在执行缓存,而不是ActiveRecord,这意味着您需要在数据库级别而不是ActiveRecord级别清除缓存和缓冲区。
例如,要清除Postgres'在Mac上缓存和缓冲区,你会做sudo purge
,这会强制刷新和清空磁盘缓存。
清除Postgres' Linux上的缓存和缓冲区,你会关闭postgres,删除缓存,然后重新启动postgres:
service postgresql stop
sync
echo 3 > /proc/sys/vm/drop_caches
service postgresql start
进一步阅读:
答案 4 :(得分:0)
我们使用:
ActiveRecord::Base.connection.query_cache.clear
(ActiveRecord::Base.connection.tables - %w[schema_migrations versions]).each do |table|
table.classify.constantize.reset_column_information rescue nil
end
但我不确定这还不够。
答案 5 :(得分:0)
由于问题的标题太宽泛,我在搜索相关问题时偶然发现了它:在迁移过程中向ActiveRecord模型添加列时,可能会发生新列在ActiveRecord类上不可用的情况. Rails 缓存列信息。为了解决这个问题,我们需要调用 reset_column_information
。
这里和示例:
# migration
Product.first # rails caches the schema
add_column :products, :name
Product.first.update(name: 'xxx') # fails
Product.reset_column_information
Product.first.update(name: 'xxx') # now it succeeds