2010-08-20 2 views
2

J'essaye d'écrire une méthode qui m'indique chaque classe qui inclut un module particulier. Il ressemble à ceci -Quand les modules sont-ils inclus dans une classe Ruby fonctionnant dans des rails?

def Rating.rateable_objects 
    rateable_objects = [] 
    ObjectSpace.each_object(Class) do |c| 
    next unless c.include? Rateable 
    rateable_objects << c 
    end 
    rateable_objects 
end 

Où "Rateable" est mon module que j'inclus dans plusieurs modèles. Ce que je trouve est que cette méthode retourne [] si je l'appelle immédiatement après le démarrage de la console ou l'exécution du serveur. Mais si j'instancie d'abord une instance de l'un des modèles consommateurs, il retournera ce modèle dans le résultat.

Alors quand les modules sont-ils inclus? Je devine plus tard dans le processus que quand l'application démarre. Si je ne peux pas obtenir cette information de cette façon au début du processus, y a-t-il un moyen d'y parvenir?

+0

Je pense qu'il serait chargé lorsque le modèle contenant le module est appelé. –

Répondre

4

Elles sont incluses lorsque l'instruction include est exécutée lorsque la classe est définie. Rails charge automatiquement les modules/classes lorsque vous les utilisez pour la première fois. En outre, vous pouvez essayer quelque chose comme ceci:

module Rateable 
    @rateable_object = [] 
    def self.included(klass) 
    @rateable_objects << klass 
    end 
    def rateable_objects 
    @rateable_objects 
    end 
end 

Ceci construira la liste comme les classes incluent le module.

+0

Malheureusement "Rails charge automatiquement les modules/classes quand vous les utilisez pour la première fois" signifie que je ne peux probablement pas obtenir ce que je veux faire fonctionner, mais cela ne rend pas la réponse moins correcte. Merci. – JoshReedSchramm

+0

ne devrait-il pas être @@ rateable_object au lieu de @rateable_objects? – MhdSyrwan

Questions connexes