2010-02-22 4 views

Répondre

6

Si vous savez à l'avance exactement quelles classes doivent être définies, vous devez probablement générer du code qui les définit explicitement avec le mot clé class pour plus de clarté. Toutefois, si vous avez vraiment besoin de les définir dynamiquement, vous pouvez utiliser Object.const_set en combinaison avec Class.new. Pour définir deux classes d'enfants de ActiveRecord::Base:

%w{A B C D}.each do |name| 
    Object.const_set name, Class.new(ActiveRecord::Base) 
end 

Le résultat de ce qui précède est de quatre nouvelles classes nommées A..D, tous les enfants de ActiveRecord::Base.

+0

Wow, c'est gentil! merci beaucoup – marshluca

5

Il est probablement préférable d'utiliser des macros ou des scripts dans votre éditeur de texte. La création de classes les rend difficiles à documenter.

+0

+1 pour avoir favorisé la génération de code sur la génération d'exécution. Ce dernier est parfois la seule façon de faire quelque chose, mais ce n'est généralement pas le meilleur moyen. – OregonGhost

+0

+1 pour plus de clarté sur l'intelligence. –

3

Vous pouvez définir des classes complètement dynamique:

A = Class.new(ActiveRecord::Base) do 
    # this block is evaluated in the new class' context, so you can: 
    # - call class methods like #has_many 
    # - define methods using #define_method 
end 
0

Je pense que « Ruby Métaprogrammation » a une question quiz sur la façon d'éviter d'utiliser le mot-clé class, mais je ne suis pas sûr si cela va vous aider à résoudre ton problème.

Questions connexes