2009-06-10 4 views
0

meine SQL DB enthält Tabellen "Jobs" und "Job_Categories."Rails: Wie verknüpft man Werte in Datenmigrationen mit Klassen-/Modellvariablen?

"job_categories" assoziiert Jobkategorien (d. H. "Software Development") mit einer ganzen Zahl (d. H. 7).

Ich brauche diese Verknüpfungen in Variablen in meinem Job-Controller für verschiedene Abfragefunktionen gespeichert. Wie kann ich mit Rails dynamisch Änderungen an der Tabelle job_categories mit Variablen in meinem Job-Controller verknüpfen? Ich habe jetzt ein paar Wochen mit RoR gearbeitet, bin aber immer noch ein wenig verschwommen darüber, wie alles zusammenwirkt. Vielen Dank!

+0

Es klingt nicht so, als ob dies etwas mit Migrationen zu tun hat, zumindest nicht im Sinne der Rails DB Schema Management. –

Antwort

3

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.

Verwandte Themen