2017-10-11 13 views
0

J'ai quelques tables qui sont rarement modifiées. Malheureusement, j'ai besoin d'appeler ces tables assez souvent dans les contrôleurs et cela ajoute du temps de chargement à certaines pages. Par exemple, dans un contrôleur je:Rails: Existe-t-il un moyen de charger les informations de la base de données lors de l'initialisation?

class PagesController < ApplicationController 
    def index 
     @groups = Group.all 
     @events = Event.all 
    end 
end 

Il m'a alors produite que, depuis les groupes et les événements changent rarement, je pouvais charger ces variables dans les initialiseurs ou comme des constantes dans un modèle afin qu'ils font réellement pas besoin interroger la base de données dans le moment. J'ai changé le ci-dessus à ce qui suit:

class Group < ApplicationRecord 
    ALL = Group.all 
end 
class Event < ApplicationRecord 
    ALL = Event.all 
end 

class PagesController 
    def index 
     @groups = Group::ALL 
     @events = Event::ALL 
    end 
end 

La solution ci-dessus fonctionne réellement en développement. En production sur Heroku, cependant, il charge les variables dans le contrôleur. J'ai également essayé de configurer un initialiseur et de définir ::Groups = Group.all mais cela charge encore les données lorsqu'il est appelé dans le contrôleur. Est-il possible de charger des informations de base de données lors de l'initialisation d'une manière qui fonctionnera sur Heroku?

Répondre

0

Malheureusement, vous n'avez pas spécifié les tailles des tables. Si elles ont des tailles modérées, j'utiliserais le Rails.cache au lieu de mémoriser les récupérations dans les contrôleurs.

Vous pouvez lire plus de détails ici:

https://devcenter.heroku.com/articles/caching-strategies#low-level-caching

par la façon dont les données doivent être memoized comme variables de classe ne sont pas des variables d'instance (aussi je voudrais stocker Foo.all.to_a - si tableau au lieu de relation AR).
Bien que je ne recommande pas de le faire de toute façon, car je ne sais pas à quelle fréquence Heroku pourrait recharger l'application. En outre, il est à coup sûr un hack et Rails.cache est en effet plus préférable moyen d'implémenter une telle mise en cache. En outre, il fournit une méthode pour invalider.