ruby-on-rails - 为什么结果是从数据库而不是缓存加载的?

标签 ruby-on-rails ruby ruby-on-rails-3 memcached

当我运行时:

IpPermission.blacklist.pluck(:ip)

我得到的结果:

=> ["127.0.0.11012q", "50.36.46.48"] 

如果我手动更改 ip_permissions 表中的任何行,然后再次运行 IpPermission.blacklist.pluck(:ip)。它显示更新的结果。它不应该从缓存而不是直接从数据库加载结果吗?

我的模型看起来像:

class IpPermission < ActiveRecord::Base
  validates_presence_of :ip, :note, :category
  validates_uniqueness_of :ip, :scope => [:category]
  validates :category, :inclusion => { :in => ['whitelist', 'blacklist'] }

  def self.whitelist
    Rails.cache.fetch('whitelist', :expires_in => 1.month) { self.where(:category => 'whitelist') }
  end

  def self.blacklist
    Rails.cache.fetch('blacklist', :expires_in => 1.month) { self.where(:category => 'blacklist') }
  end
end

最佳答案

我认为这应该可以解决我们的问题:

改变这个

  def self.whitelist
    Rails.cache.fetch('whitelist', :expires_in => 1.month) { self.where(:category => 'whitelist') }
  end

  def self.blacklist
    Rails.cache.fetch('blacklist', :expires_in => 1.month) { self.where(:category => 'blacklist') }
  end

对此

  def self.whitelist
    Rails.cache.fetch('whitelist', :expires_in => 1.month) { self.where(:category => 'whitelist').all }
  end

  def self.blacklist
    Rails.cache.fetch('blacklist', :expires_in => 1.month) { self.where(:category => 'blacklist').all }
  end

where 不会进行实际查询,如果您放置 .all 然后进行查询,那么您不会存储数据而只是存储查询

关于ruby-on-rails - 为什么结果是从数据库而不是缓存加载的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13305048/

相关文章:

scope - form_for 和作用域,rails 3

sql - 如何根据组和顺序查询记录?

ruby-on-rails - 无法与docker-compose同步文件

ruby-on-rails - 在 ruby​​ 中查找数组和事件记录变量之间的相同值

ruby-on-rails - ruby rails : Search form

javascript - 选择用户,然后选择他的挑战的下拉列表

ruby-on-rails - 在 Rails 中动态重新加载路由是个坏主意吗?

ruby-on-rails - Ruby on Rails 继承语法

Ruby:删除小数点后(包括)小数点后的所有内容

ruby-on-rails - rails 3 : How to "redirect_to" in Ajax call?