рельсы: как связать значения при миграции данных с переменными класса / модели? - PullRequest
0 голосов
/ 10 июня 2009

Моя БД sql содержит таблицы "jobs" и "job_categories."

"job_categories" связывает строки категории заданий (т.е. "Разработка программного обеспечения") с целым числом (т.е. 7).

Мне нужно сохранить эти ассоциации в переменных в моем контроллере заданий для различных функций запросов. Как я могу использовать rails для динамического связывания изменений в таблице job_categories с переменными в моем контроллере заданий? Я работаю с RoR уже несколько недель, но все еще немного размышляю о том, как все взаимодействует. Спасибо!

1 Ответ

3 голосов
/ 10 июня 2009

Есть одна большая ошибка с тем, что ты пытаешься сделать, но сначала я отвечу на твой вопрос в ответ на вопрос.

Создайте методы доступа уровня класса в вашем 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-процессы, и никаких устаревших данных.

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