Кэширование набора простых запросов в rails

#ruby-on-rails #database #caching

#ruby-on-rails #База данных #кэширование

Вопрос:

В моем приложении есть объекты, и они принадлежат странам, регионам, городам, типам, группам, компаниям и другим наборам. Каждый набор довольно прост — у него есть идентификатор, имя, а иногда и некоторые указатели на другие наборы, и он никогда не меняется. Некоторые наборы небольшие, и я загружаю их в before_filter вот так:

 @countries = Country.all
@regions = Region.all
  

Но затем я вызываю, например,
offer.country.name
или
region.country.name
и мое приложение выполняет отдельный запрос к базе данных по идентификатору, хотя я уже загрузил их все. После этого я выполняю запрос через:include , и идентификаторы этого случая, сгенерированные при быстрой загрузке, не зависят от того, загрузил ли я эти данные с помощью другого запроса по идентификатору или нет.

Итак, я хочу немного кэша. Например, я могу сгенерировать хэши с ключами в качестве идентификаторов записей в моем before_filter, а затем вызвать @countries[offer.country_id].name . В этом случае, кажется, мне не нужна быстрая загрузка, и здесь легко включить Rails.cache. Но, может быть, есть какое-то умное встроенное решение rails, которое не требует переписывать все?

Ответ №1:

Кэширование списков подобных моделей не будет кэшировать отдельные экземпляры, которые существуют в ассоциациях другой модели.

Команда Rails работала над внедрением карт идентификации в Rails 3.1, чтобы решить именно эту проблему, но пока она отключена по умолчанию. Вы можете включить его и посмотреть, работает ли он для вашей проблемы.

Комментарии:

1. Я переключился на Rails 3.1 и включил карты идентификации, и, похоже, они работают, поэтому у меня есть только один экземпляр каждого @country = Country.find(1) . Но это не совсем то, что я хочу, потому что карты идентификации не уменьшают количество запросов к базе данных. В идеале должен быть sql-анализатор, который сравнивает два запроса и обнаруживает, что результаты одного (частично) совпадают с другими. Общая задача сложная, но кажется довольно простым использовать некоторый кэш по идентификатору в active record find (: ids) и всех методах.