Ruby on Rails:如何设置“查找”选项以不使用缓存
Posted
技术标签:
【中文标题】Ruby on Rails:如何设置“查找”选项以不使用缓存【英文标题】:Ruby on Rails: How to set up "find" options in order to not use cache 【发布时间】:2011-06-05 21:39:57 【问题描述】:在 Ruby on Rails 中,您可以使用以下语法从数据库中查找记录:
<model_name>.find_by_<field_name>()
示例:User.find_by_email('test@test.test')
、User.find_by_id(1)
、...
前段时间,如果我没记错的话,我在某处读到您可以为“查找”操作显式禁用缓存,但我不记得如何操作了。
谁能帮我记住?
【问题讨论】:
我没有看到默认的缓存设置...你确定吗?你检查过你的日志吗? 我同意apneadiving。我不认为它是默认缓存的。 【参考方案1】:你可以像这样使用ActiveRecord::QueryCache.uncached
:
User.find_by_email('test@test.test')
User.find_by_email('test@test.test') # Will return cached result
User.uncached do
User.find_by_email('test@test.test')
User.find_by_email('test@test.test') # Will query the database again
end
在控制器中,它看起来像这样:
def show # users#index action
User.uncached do
@user = User.find_by_email('test@test.test')
@another_user = User.find_by_email('test@test.test') # Will query database
end
User.find_by_email('test@test.test') # Will *not* query database, as we're outside of the Users.uncached block
end
显然,在模型中,您只需要这样做:
class User < ActiveRecord::Base
def self.do_something
uncached do
self.find_by_email('test@test.test')
self.find_by_email('test@test.test') # Will query database
end
end
end
User.do_something # Will run both queries
【讨论】:
我不明白如何使用这些代码:我必须放什么而不是'self.find(...)'?你能举个实际的例子吗? 我已经更新了我的示例,但是当您只是给我抽象代码时,这很困难。你想在控制器或模型中使用它吗?如果是控制器,您可以使用我的第一个示例。如果是模型,你可以使用我的最后一个。如果您发布您正在尝试做的事情可能会更容易,而不是我试图提出对您有意义的示例。【参考方案2】:(注意:假设 Rails3,因为 Rails2 没有默认缓存。)
这应该可以按照您的意愿开箱即用:
-
查询缓存在每次操作后被销毁(http://guides.rubyonrails.org/caching_with_rails.html 第 1.5 段)
此外,似乎 (http://ryandaigle.com/articles/2007/2/7/what-s-new-in-edge-rails-activerecord-explicit-caching) 缓存也在属性上被破坏/记录更新
您是否有默认配置未涵盖的特定用例?
【讨论】:
我正在尝试以某种方式解决这个问题:***.com/questions/4636704/…以上是关于Ruby on Rails:如何设置“查找”选项以不使用缓存的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails 表单添加带有文本框的“其他”选项以选择下拉菜单
如何以可扩展的方式部署 [Ruby on Rails] 站点?
如何使用 docker(ruby on rails)设置 anycable?