Il y a une grande chasse aux sorcières avec ce que vous essayez de faire, mais d'abord je vais répondre à votre question posée.
Créez des accesseurs de niveau classe dans votre JobsController, puis écrivez un observateur dans la classe JobCategory qui apporte les modifications appropriées au JobsController après les événements save et destroy.
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
Vous aurez besoin d'une logique supplémentaire qui supprime l'ancien nom si vous autorisez les changements de nom. Les méthodes dans ActiveRecord::Dirty aideront avec cela.
Ainsi, la chasse aux sorcières. Le problème avec une telle approche est que, généralement, vous avez plus d'un processus de traitement des demandes. Vous pouvez apporter une modification à la table job_categories
, mais cette modification uniquement est mise à jour dans un processus. Les autres sont maintenant rassis.
Votre table job_categories
est susceptible d'être faible. S'il est accédé avec n'importe quelle fréquence, il sera mis en cache dans la mémoire, soit par le système d'exploitation ou le serveur de base de données. Si vous l'interrogez assez, les résultats de cette requête peuvent même être mis en cache par la base de données. Si vous ne l'interrogez pas très souvent, vous ne devriez pas vous soucier d'essayer de mettre en cache à l'intérieur JobsController
de toute façon.
Si vous devez absolument mettre en cache dans la mémoire, il vaut mieux aller avec memcached. Ensuite, vous obtenez un cache unique sur lequel travaillent tous vos processus Rails et aucune donnée périmée.
Il ne semble pas que cela ait quelque chose à voir avec les migrations, du moins pas dans le sens de la gestion de schéma de base de données Rails. –