0

В моем действии индекса пользователя Я выполняю запрос, который находит всех пользователей, принадлежащих к тому же городу, что и current_user, и противоположный пол и сортирует результат по profile_update_at в заказе DESC. Запрос работает просто отлично. Приложение в настоящее время работает в 3 городах. Таким образом, каждый мужчина из City A, по сути, выполняет тот же запрос, а также для женщин из города A.Стратегия кэширования Rails для действия индекса

Я хочу, чтобы иметь возможность кэшировать этот запрос в течение примерно 5 минут. Как я могу это сделать? Какого типа кеширования я должен использовать? Поскольку запрос зависит от города и пола от current_user, будет ли кеш, созданный для пользователя из города A, вмешиваться в запрос пользователя из City B? Или будет создан новый кеш для пользователя из города B.

ответ

2

Вы можете использовать Rails.cache (http://guides.rubyonrails.org/caching_with_rails.html#cache-stores). Каждая комбинация города и пола является уникальным ключом кэш-памяти. Таким образом, в индексном действия вы будете иметь что-то вроде: код контроллера:

def index 
    @users = User.same_city_opp_gender_as(current_user) 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @users } 
    end 
end 

код модели:

def self.same_city_opp_gender_as(user) 
    Rails.cache.fetch("users/#{user.city}/#{user.gender}"){ User.where(city: user.city).where(gender: user.gender).order(:updated_at) } 
end 

Также класс Пользователь должен обеспечить город и гендерные методы. Для 3 города (A, B, C) и 2 пола (M, F), вы получите 6 тайников со следующими ключами:

  • "пользователей/A/M"
  • «пользователей/A/F "
  • "пользователей/B/M"
  • "пользователей/B/F"
  • "пользователи/C/M"
  • "пользователи/C/F"

Таким образом, каждый вызов of same_city_opp_gen der_as генерирует новый кеш, если он промахивается, или извлекает значение, если присутствует кеш. Подумайте об истечении срока действия кеша и прочитайте https://devcenter.heroku.com/articles/building-a-rails-3-application-with-memcache

+0

Вы передаете город и пол для извлечения функции. Они используются для создания кеш-ключа. Если такой ключ хранится, рельсы возвратят его значение без запроса db, иначе он запустит блок и сохранит возвращаемое значение для хранения. – Berlin

+0

@pratski прочитал мое обновление – Berlin

+0

показывает, что он кэширует, но он повторно запускает запрос. Кроме того, это не кэширование, поскольку, если результаты обновляются в течение 5 минут, он показывает обновления. – pratski

Смежные вопросы