J'ai une méthode de classe mélangée à tous mes modèles. La méthode est appelée lorsque la classe de modèle est évaluée. Malheureusement (pour moi), cela semble être à la demande, chaque fois que le modèle est nécessaire dans le développement env. Comment les rails peuvent-ils charger tous les modèles au démarrage? Est-ce même conseillé?
class Foo < ActiveRecord::Base include Acl register_acl # i need this to be called for all models at start up end
3 Réponses :
dans les modèles de concept MVC ne sont pas destinés à agir seuls, c'est-à-dire qu'ils ne devraient agir que lorsque le contrôleur leur envoie un message (par exemple, @ foo.register_acl). Les instances de modèle ne doivent même pas exister jusqu'à ce qu'elles soient créées par contrôleur. P>
Qu'essayez-vous de réaliser avec votre méthode Register_ACL? P>
Si vous avez vraiment besoin de quelque chose à exécuter sur la création d'objets, vous pouvez utiliser la méthode Initialize () qui est appelée chaque fois qu'un objet rubis est créé. P>
Toutefois, si vous avez besoin de modèle pour exécuter du code par lui-même, vous êtes probablement confronté à une odeur de code et vous devez modifier quelque chose dans votre application. P>
Merci pour la réponse! J'ai mis à jour ma question pour vous faire savoir ce que j'essaie de faire. Je n'essaie pas de créer / obtenir des instances du modèle. J'ai juste besoin du fichier de modèle pour être chargé et évalué par des rails au démarrage. Dans un programme Ruby régulier, vous pouvez vous attendre à ce que le code de classe soit évalué au démarrage. Merci!
Je ne sais pas si c'est idéal, mais ça marche pour moi. Quelque part dans la configuration / initialise /, je le fais: et qui précharge mes modèles p> p> P>
Cela ne chargera pas de modèles ni de modèles imbriqués dans des moteurs montés, par exemple. La meilleure approche s'appelle rails.application.eger_load! Code>, comme la réponse précédente suggérée.
Merci d'avoir souligné cela, @ dzajic. Cela a été pour toujours, mais il est temps que la réponse soit changée à la meilleure solution!
La bonne façon de faire cette application à l'échelle est d'activer Si vous voulez le faire sporadiquement: p> cache_classes code> dans votre configuration. Par défaut, il est hors de développement mais sur la production.
cache_classes est très gênant dans le développement. Je vais essayer la méthode Eagglar_load! Merci!