带有查询字符串参数的 Rails 动作缓存

Posted

技术标签:

【中文标题】带有查询字符串参数的 Rails 动作缓存【英文标题】:Rails action caching with querystring parameters 【发布时间】:2010-01-01 13:57:38 【问题描述】:

如果我的操作具有查询字符串参数,如何使用 Rails 缓存我的 REST 控制器?

Example: GET /products/all.xml?max_price=200

谢谢!

【问题讨论】:

【参考方案1】:

如果你想缓存一个动作,基于所有的查询参数(或者说几乎所有的参数),你可以这样做:

caches_action :my_action, :cache_path => Proc.new  |c| c.params 

或者,您可能只需要一些仅用于 Analytics 的参数(但与您正在获取的记录无关):

caches_action :my_action, :cache_path => Proc.new  |c| c.params.delete_if  |k,v| k.starts_with?('utm_')  

【讨论】:

假设该动作有用户名 john,并且您已经根据传入的随机获取参数缓存了几个版本。有没有办法使使用用户名 john 和所有缓存的动作的缓存无效带参数的版本?示例 /john/picture?dimension=50 和 /john/picture?dimension=100 是否可以清除所有版本的 johns 图片? @Marc:是的,请参阅命名空间以获取想法code.google.com/p/memcached/wiki/… 希望这对某人有所帮助:在 Rails 3 中,当一个具有自定义参数的动作缓存过期时,定义了一种格式,并且您已设置默认 URL 以确保尾部斜杠,expire_action(:action => :my_action, :param_1 => "val", :format => :json),rails 没有使用正确的缓存键。由于它推断扩展名的方式,它将清除 /my_action.json/?param_1=val.json 而不是清除缓存键 /my_action.json/?param_1=val。 github.com/rails/rails/blob/3-2-stable/actionpack/lib/… 那么在使用 cache_path 时如何使操作过期?【参考方案2】:

要将请求 url 用作缓存键,我会这样做:

caches_action :index, :cache_path => Proc.new |c| c.request.url 

【讨论】:

【参考方案3】:

在这种情况下,您应该使用片段缓存:

在您的控制器中:

cache(params[:max_price], :expires_in => 10.minute) do
  # get the result
end

【讨论】:

以上是关于带有查询字符串参数的 Rails 动作缓存的主要内容,如果未能解决你的问题,请参考以下文章

Rails的不同缓存策略

如何清除 Rails 动作缓存? (Rails.cache.clear 不起作用)

Rails:在 link_to 中保留 GET 查询字符串参数

在 Rails 6 中更新底层模型时如何使动作缓存过期?

Rails ActiveRecord Arels:不支持的参数类型:字符串。改为构造一个 Arel 节点

AWS API-Gateway:指定的缓存键参数无效