Es gibt ein großes Problem mit dem, was Sie versuchen zu tun, aber zuerst werde ich Ihre Frage beantworten.
Erstellen Sie Zugriffsberechtigungen auf Klassenebene in Ihrem JobsController, und schreiben Sie dann einen Observer für die Klasse JobCategory, der nach dem Speichern und Löschen von Ereignissen die entsprechenden Änderungen an JobsController vornimmt.
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
Sie werden zusätzliche Logik benötigen, die den alten Namen entfernt, wenn Sie für Namensänderungen ermöglichen. Die Methoden in ActiveRecord::Dirty helfen dabei.
Also, der Gotcha. Das Problem bei einem solchen Ansatz besteht darin, dass Sie in der Regel mehr als einen Prozess haben, der Anforderungen bedient. Sie können die Tabelle job_categories
ändern, aber nur diese Änderung wird in einem Prozess aktualisiert. Die anderen sind jetzt abgestanden.
Ihre Tabelle job_categories
ist wahrscheinlich klein. Wenn auf sie mit einer beliebigen Häufigkeit zugegriffen wird, wird sie entweder vom Betriebssystem oder vom Datenbankserver im Arbeitsspeicher zwischengespeichert. Wenn Sie es genügend abfragen, können die Ergebnisse dieser Abfrage sogar von der Datenbank zwischengespeichert werden. Wenn Sie es nicht sehr oft abfragen, dann sollten Sie sich nicht darum kümmern, innerhalb JobsController
trotzdem zu cachen.
Wenn Sie absolut im Speicher zwischenspeichern müssen, gehen Sie besser mit memcached. Dann erhalten Sie einen einzigen Cache, in dem alle Ihre Rails-Prozesse arbeiten, und keine veralteten Daten.
Es klingt nicht so, als ob dies etwas mit Migrationen zu tun hat, zumindest nicht im Sinne der Rails DB Schema Management. –