2009-02-18 4 views
2

J'ai un initialisateur qui définit une valeur par défaut qui est utilisée dans toute l'application. La valeur est un modèle ActiveRecord, je cache l'essentiel pour la durée de vie de l'application:Dépendance sur les données de l'appareil dans l'initialiseur de rails

@@default_region = Region.find_by_uri("whistler") 

L'enregistrement est garanti dans la base de données: il est des données de fixation qui est référencé par d'autres modèles. Cela fonctionne correctement, sauf dans l'environnement de test où la base de données est purgée avant chaque exécution de test. (Je cours sur des rails de bord et je pense que c'est un comportement récent: je pouvais insérer les données manuellement et les conserver entre les tests.) J'ai aussi l'enregistrement dans mon fichier de luminaire regions.yml, mais les appareils ne sont pas chargés jusqu'à ce que l'initialisation des rails soit terminée.

Quelle est la bonne façon de faire face à une telle dépendance sur les données d'appareils? Ou y a-t-il une meilleure façon de structurer cela? Je préfèrerais ne pas utiliser un before_filter car il n'y a aucun sens à recharger ceci à chaque requête: ça ne changera pas sauf sur un déploiement différent.

Répondre

2

je mettrais quelque chose comme ça dans region.rb:

def self.default_region 
    @@default_region ||= Region.find_by_uri("whistler") 
end 

Ensuite, vous pouvez y accéder en tant que Region.default_region où vous en avez besoin, et il est seulement regardé une fois - la première fois qu'il est appelé - et d'ici là les appareils seront en place.

+0

Très bonne solution ... se débarrasse de toute la dépendance. Tout se déplace vers le modèle par la suite! –

1

Pas vraiment familier avec Ruby ou Rails ... mais pourquoi ne pas essayer un scénario de "chargement paresseux"? Fondamentalement, avoir une fonction globale qui vérifie si les données ont été chargées, et sinon, récupère-la de la base de données, puis la cache. Et s'il était déjà en cache, il suffit de le retourner. De cette façon, vous ne tenterez pas de toucher la base de données tant que cette fonction ne sera pas appelée pour la première fois et que tout devrait être initialisé d'ici là.

+0

Dans l'environnement de test, la base de données est purgée, donc il n'y a rien à charger paresseux à partir de la base de données à ce stade. Je devrais le charger dans la base de données à partir d'un fichier s'il n'existe pas. –

+0

Je pensais que vous avez dit que les appareils sont chargés après l'initialisation des rails. Est-ce que je manque quelque chose? – bobwienholt

+0

Oui, la séquence de test fonctionne comme ceci: exécuter 'rake test' efface la base de données; rails initialise (c'est là que je frappe la dépendance); les projecteurs sont ensuite chargés pour l'environnement de test. –

Questions connexes