Зависимость от данных крепежа в инициализаторе рельсов - PullRequest
2 голосов
/ 18 февраля 2009

У меня есть инициализатор, который устанавливает значение по умолчанию, которое используется во всем приложении. Значение представляет собой модель ActiveRecord, я, по сути, кеширую ее на протяжении всего жизненного цикла приложения:

@@default_region = Region.find_by_uri("whistler")

Запись гарантированно находится в базе данных: это данные прибора, на которые ссылаются другие модели. Это работает нормально, за исключением тестовой среды, где база данных очищается перед каждым тестовым запуском. (Я бегу по рельсам, и я думаю, что это недавнее поведение: я имел обыкновение вставлять данные вручную и сохранять их между тестовыми прогонами.) У меня также есть запись в моем файле фикстур regions.yml, но фикстуры не ' загружен до завершения инициализации рельсов.

Как правильно справляться с такой зависимостью от данных прибора? Или есть лучший способ структурировать это? Я бы предпочел не использовать before_filter, потому что нет смысла перезагружать его при каждом запросе: он не изменится, за исключением другого развертывания.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2009

Я бы поместил что-то вроде этого в region.rb:

def self.default_region
  @@default_region ||= Region.find_by_uri("whistler")
end

Затем вы можете получить доступ к нему как Region.default_region, где бы он вам ни понадобился, и он будет найден только один раз - при первом вызове - и к тому времени приборы будут на месте.

1 голос
/ 18 февраля 2009

Не очень знаком с Ruby или Rails ... но почему бы вам не попробовать сценарий "отложенной загрузки"? По сути, есть глобальная функция, которая проверяет, были ли загружены данные, и если нет, извлекает их из базы данных, а затем кэширует их. И если он уже был кэширован, просто верните его.

Таким образом, вы не будете пытаться получить доступ к базе данных, пока эта функция не будет вызвана в первый раз, и к этому времени все должно быть инициализировано.

...