Rails 3: кеширование в глобальную переменную - PullRequest
2 голосов
/ 18 февраля 2011

Я уверен, что "глобальная переменная" заставит волосы на затылке встать.Я пытаюсь сохранить иерархическое меню в таблице данных act_as_tree (готово).В application_helper.rb я создаю html-меню, опрашивая базу данных и обходя дерево (готово).Я не хочу делать это при каждой загрузке страницы.

Вот что я попробовал:

application.rb

config.menu = nil

application_helper.rb

def my_menu_builder
  return MyApp::Application.config.menu if MyApp::Application.config.menu
  # All the menu building code that should only run once
  MyApp::Application.config.menu = menu_html
end

menu_controller.rb

def create
  # whatever create code
  expire_menu_cache
end

protected
def expire_menu_cache
  MyApp::Application.config.menu = nil
end

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

Это часть срока действия кэша, которая не работает.Когда я сбрасываю переменную config.menu в nil, предположительно в следующий раз через my_menu_builder, она обнаружит это изменение и перестроит меню, кэшируя новые результаты.Кажется, этого не происходит.

Вопросы:

Является ли Application.config хорошим местом для хранения подобных вещей?Кто-нибудь видит очевидный недостаток в этой стратегии кэширования?

Не говорите, преждевременная оптимизация - это этап, на котором я нахожусь. Итерация преждевременной оптимизации:)

Спасибо!

Ответы [ 2 ]

4 голосов
/ 18 февраля 2011

Я бы избегал глобальных переменных и использовал бы средства кэширования Rails.

http://guides.rubyonrails.org/caching_with_rails.html

3 голосов
/ 18 февраля 2011

Одним из способов достижения этого является установка пустого хеша в вашем файле application.rb:

MY_VARS = {}

Затем вы можете добавить в этот хеш все, что захотите, который доступен везде.

MY_VARS[:foo] = "bar"

и в других местах:

MY_VARS[:foo]

Как вы почувствовали, это не способ поведения Rails, даже если он работает.Существуют различные способы использования кэширования в Rails:

  • простой кэш в памяти, объясненный здесь :

    Rails.cache.read("city") # => nil

    Rails.cache.write("city", "Duckburgh")

    Rails.cache.read("city") # => "Duckburgh"

  • использование реального движка, такого как memcached

Я призываю вас взглянутьhttp://railslab.newrelic.com/scaling-rails

Это место, где можно научиться кэшированию во всех его формах.

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