清除ActiveRecord缓存

时间:2010-09-18 07:02:16

标签: ruby activerecord caching

我正在使用ActiveRecord 3.0(没有rails)构建命令行应用程序。如何清除ActiveRecord维护的查询缓存?

6 个答案:

答案 0 :(得分:30)

第一个近似值:

ActiveRecord::Base.connection.query_cache.clear

答案 1 :(得分:2)

答案 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