Лучшая практика для кэширования дорогих списков неперерисованных данных в Rails - PullRequest
2 голосов
/ 20 октября 2011

Это общий вопрос, но чтобы разобраться в этом, давайте обсудим конкретный пример. Предположим, у вас есть приложение, в котором часто используются формы, содержащие список всех стран мира. Страны хранятся в таблице countries в вашей БД, но эта таблица обновляется очень редко и только через ваш файл seed.rb.

Чтобы иметь возможность сэкономить немного времени в каждом запросе, я обычно управляю такими вещами следующим образом:

module ApplicationHelper

    def self.get_countries
        countries = Country.order("name asc").all.collect{|country| [country.name, country.name]}
        countries.unshift(["",""])
        countries
    end

    # In production mode (cache_classes = true) this is executed only once, and 
    # will remain cached until you restart your application server
    @@COUNTRIES =  ApplicationHelper.get_countries

    # This would be called from various views
    def countries_for_select(country)
        selected = country.name unless country.nil?
        options_for_select(@@COUNTRIES, selected)
    end
end

Это разумный подход?

Пожалуйста, не предлагайте не хранить список стран в базе данных. Я знаю, что есть и другие способы управления списками стран. На самом деле меня не интересуют страны - это просто самый простой для понимания пример, который я могу придумать для иллюстрации этого общего вопроса.

1 Ответ

0 голосов
/ 20 октября 2011

Я не уверен, что вы имеете в виду под "не предоставленными данными". При использовании вашего метода представление формы по-прежнему должно проходить по всем странам и отображать опцию для выбора для каждой из них.

<select id="user_country" name="user[country]">
  <option value="US">United States</option>
  <option value="CA">Canada</option>
  <option value="ET">Etcetera</option>

Если, однако, вы поместили выделение в кэш фрагмента, то при первом отображении формы после последнего развертывания параметры выбора будут отображаться и затем кэшироваться в отдельный файл в / tmp / cache. Затем при каждом последующем загрузке формы этот кэшированный файл будет использоваться рельсами, как если бы он был частичным и вставлялся в форму.

<% form_for @user do |form| %>
  <% cache('user_countries_selector') do %>
    <% form.select :country, Country.order("name asc").all.collect{|country [country.name, country.name]}
  <% end %>
  <% etc, etc, etc %>
<% end %>

хотя на практике я бы, вероятно, переместил код Country.order... во вспомогательный метод. При использовании этого метода кэширование списка стран в @@ СТРАНАХ совершенно не требуется.

Если вам нужно отобразить выбранную страну в других формах, вы должны передать другой ключ cache(), поскольку идентификатор и имя отображаемого тега выбора будут зависеть от формы.

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