轨道中的低级缓存4

时间:2017-06-06 13:06:52

标签: ruby ruby-on-rails-4 caching

我有两个模型Employee and Organization

class Employee < ActiveRecord::Base
  belongs_to :organization, touch: true
end

class Organization < ActiveRecord::Base
  has_many :employees
end

有一个用于搜索员工的表单。

搜索查询基于first_name,last_name和emp_id。

我正在尝试实施低级缓存

在员工控制器中

def list_employees
  first_name = params[:employee][:first_name]
  last_name  = params[:employee][:last_name]
  emp_id     = params[:employee][:emp_id]
  @employees = Employee.all_employees(first_name,last_name,emp_id)
end

在员工模型中

def self.all_employees(first_name,last_name,emp_id)
  cache_key = "#{first_name}-#{last_name}-#{emp_id}"
  Rails.cache.fetch("#{cache_key}", expires_in: 5.minutes) do
    Employee.where("first_name like ? and last_name like ? and emp_id like ?","%#{first_name}%","%#{last_name}%","%#{emp_id}%")
  end
end

但每次再次查询时我都看不出任何差异。我可以看到数据 Rails.cache.fetch(&#34; cache_keys&#34;)来自控制台,即使在此查询到员工表。

我第一次查询时需要500毫秒 第二次相同的查询需要490ms(不从缓存服务)

让我知道我做错了什么。

提前致谢

1 个答案:

答案 0 :(得分:0)

这是您存储为缓存值的内容:

Employee.where("first_name like ? and last_name like ? and emp_id like ?","%#{first_name}%","%#{last_name}%","%#{emp_id}%")

这不是员工列表,这只是有关如何查找员工的信息。因此,当您稍后从缓存中检索此对象时,您每次都会运行查询,以获取员工。

在缓存时运行查询,方法是将.to_a附加到该缓存中。这将返回一组员工,这是您要缓存的内容。

相关问题