首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >低级别缓存数据库查询[Ruby/Rails]

低级别缓存数据库查询[Ruby/Rails]
EN

Stack Overflow用户
提问于 2022-06-19 14:01:54
回答 1查看 78关注 0票数 1

我有一个关于如何让低级别缓存工作的问题。我现在需要我的web应用程序的这个功能。

  • 这样,第一个未经过滤的页面每天只会发出一个数据库请求(24小时)。-未完成

因此,低级别缓存可能是这方面的前进方向吗?我尝试过基于文档实现它,但是我在设置上有一点困难。这是我目前在主计长中的代码

代码语言:javascript
复制
class HomeController < ApplicationController
  before_action :set_freelancer, only: %i[ show edit update destroy ]


  def cache
    freelancers_scope = Rails.cache.fetch("freelancers", expires_in: 24.hours) do
      Freelancer.order(featured: :desc)
    end
    index(freelancers_scope)
  end

  def index 
    if(freelancers_scope == nil)
      cache
    else
      freelancers_scope = freelancers_scope.where("cost >= ?", params[:cost_lower_than]) if params[:cost_greater_than].present?
      freelancers_scope = freelancers_scope.where("cost <= ?", params[:cost_greater_than]) if params[:cost_lower_than].present?
      @pagy, @freelancers = pagy(freelancers_scope)
    end
  end

  private

  def set_freelancer
    @freelancer = Freelancer.find(params[:id])
  end
end

这就是它没有添加缓存功能的情况。

代码语言:javascript
复制
lass HomeController < ApplicationController
  before_action :set_freelancer, only: %i[ show edit update destroy ]



  def index
    freelancers_scope = Freelancer.order(featured: :desc)
    freelancers_scope = freelancers_scope.where("cost >= ?", params[:cost_lower_than]) if params[:cost_greater_than].present?
    freelancers_scope = freelancers_scope.where("cost <= ?", params[:cost_greater_than]) if params[:cost_lower_than].present?

    @pagy, @freelancers = pagy(freelancers_scope)
  end

  private

  def set_freelancer
    @freelancer = Freelancer.find(params[:id])
  end
end

如何将Freelancer.order的结果缓存24小时(特色::desc),然后将其从缓存中删除,再次运行查询?我现在就是这样犯错误,这让我有点抓狂:)

更新:

代码语言:javascript
复制
class HomeController < ApplicationController
  before_action :set_freelancer, only: %i[ show edit update destroy ]



  def index
    freelancers = Rails.cache.fetch('freelancers', expires_in: 24.hours) do
      Freelancer.order(featured: :desc).map(&:attributes)
    end
  
    freelancers = freelancers.select do |freelancer|
      freelancer['cost'].in?((params[:cost_lower_than].to_i || 0)..params[:cost_greater_than].presence)
    end
  
    @pagy, @freelancers = pagy_array(freelancers)
  end
  

  private

  def set_freelancer
    @freelancer = Freelancer.find(params[:id])
  end
end

https://ibb.co/mzFXWfd,这就是我现在遇到的错误吗?

EN

回答 1

Stack Overflow用户

发布于 2022-06-19 14:55:36

首先,我必须警告,将所有ActiveRecord记录存储在缓存中是非常糟糕的做法,因为如果您将拥有几十万条记录,您将始终缓存所有记录,然后再进行抓取,然后您将需要遍历这些记录以找到符合条件的记录。

但这里有一个例子:

由于Rails推荐活动记录对象的不缓存实例,因此需要简化对象。此外,你需要缓存所有自由职业者,而不应用任何过滤器。您可以在从缓存中提取记录后应用筛选器,如下所示。而且,由于您有一组自由职业者,而不是ActiveRecord_Relation,所以您需要告诉您的pagy gem如何使用数组。

还请记住,您必须在列出@freelancers的位置更改代码。

由此:

代码语言:javascript
复制
@freelancers.each do |freelancer|
  freelancer.cost
end

对此:

代码语言:javascript
复制
@freelancers.each do |freelancer|
  freelancer['cost']
end
代码语言:javascript
复制
def index
  freelancers = Rails.cache.fetch('freelancers', expires_in: 24.hours) do
    Freelancer.order(featured: :desc).map(&:attributes)
  end

  if params[:cost_lower_than].present? || params[:cost_greater_than].present?
    from = params[:cost_lower_than].to_i
    to = params[:cost_greater_than].to_i.zero? ? nil : params[:cost_greater_than].to_i
    freelancers = freelancers.select do |freelancer|
      freelancer['cost'].to_i.in?(from..to) 
    end
  end

  @pagy, @freelancers = pagy_array(freelancers)
end
代码语言:javascript
复制
# config/initializers/pagy.rb

require 'pagy/extras/array'

注意事项:您可以在代码中或从控制台rake tmp:cache:clear中使用此命令Rails.cache.clear重置缓存

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72677485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档