Ruby on Rails: как настроить параметры поиска, чтобы не использовать кеш - PullRequest
13 голосов
/ 09 января 2011

В Ruby on Rails вы можете найти записи из базы данных с этим синтаксисом:

<model_name>.find_by_<field_name>()

Примеры: User.find_by_email('test@test.test'), User.find_by_id(1), ...

Время назад, если я не ошибаюсь, я где-то читал, что вы можете явно отключить кэширование для операций 'find', но не могу вспомнить, как.

Может ли кто-нибудь помочь мне вспомнить?

Ответы [ 2 ]

21 голосов
/ 09 января 2011

Вы можете использовать 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
2 голосов
/ 09 января 2011

(Примечание: предполагается, что Rails3, поскольку Rails2 не имеет кэширования по умолчанию.)

Это должно работать так, как вы хотите, из коробки:

  1. Запросы кешируютсяуничтожается после каждого действия (http://guides.rubyonrails.org/caching_with_rails.html параграф 1.5)
  2. Кроме того, кажется (http://ryandaigle.com/articles/2007/2/7/what-s-new-in-edge-rails-activerecord-explicit-caching), что кэши также уничтожаются при обновлении атрибута / записи

Есть ли конкретный вариант использования, не охватываемый конфигурацией по умолчанию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...