Есть одна большая ошибка с тем, что ты пытаешься сделать, но сначала я отвечу на твой вопрос в ответ на вопрос.
Создайте методы доступа уровня класса в вашем JobsController, затем напишите Observer в классе JobCategory, который вносит соответствующие изменения в JobsController после сохранения и уничтожения событий.
class JobsController < ActionController::Base
@@categories = JobCategory.find(:all)
cattr_accessor :categories
# ...
end
class JobCategoryObserver < ActiveRecord::Observer
def after_save(category)
JobsController.categories[category.name] = category.id
end
def after_destroy(category)
JobsController.categories.delete(category.name)
end
end
Вам понадобится дополнительная логика, которая удаляет старое имя, если вы разрешаете изменение имени. Методы в ActiveRecord :: Dirty помогут в этом.
Итак, Гоча. Проблема такого подхода состоит в том, что обычно у вас есть несколько процессов, обслуживающих запросы. Вы можете внести изменения в таблицу job_categories
, но это изменение обновляется только в одном процессе. Остальные теперь устарели.
Ваш job_categories
стол, вероятно, будет маленьким. Если к нему обращаются с какой-либо частотой, он будет кэшироваться в памяти, либо ОС, либо сервером базы данных. Если вы запросите его достаточно, результаты этого запроса могут даже кэшироваться базой данных. Если вы не часто запрашиваете его, вам не стоит беспокоиться о попытке кеширования внутри JobsController
.
Если вам абсолютно необходимо кешировать память, вам лучше использовать memcached. Затем вы получаете один кеш, с которым работают все ваши Rails-процессы, и никаких устаревших данных.