2011-06-22 28 views
8

En una aplicación de Rails en la que estoy trabajando, tengo un modelo "Tipo" que se relaciona con el modelo de herencia de tabla única "Nodo": cualquier posible subclase de Nodo se define como un Tipo en la tabla de tipos.Carga dinámica de clases: ¿hay un "method_missing" para las clases en Ruby?

Ahora es posible cargar todas las clases en un inicializador, pero me gustaría cargar las subclases solo cuando sean necesarias.

La mejor solución que puedo pensar sería tener un respaldo en una constante no inicializada que verificaría si esa constante puede representar una clase en la aplicación, algo similar a lo que hace el método_destino.

Me gustaría obtener algunos consejos sobre cómo y dónde definir esta lógica, o si hay una mejor solución.

Respuesta

10

Hay Module#const_missing:

http://apidock.com/ruby/Module/const_missing

Asumo que pueda (ab) uso que para sus necesidades.

+0

ops! Publiqué la misma respuesta solo unos segundos después: P –

+0

¿Lo tomo usted dice (ab) usar, ya que está lejos de ser una buena práctica? :) En el caso, cualquier sugerencia es más que bienvenida y apreciada. De todos modos exactamente lo que estaba buscando, ¡muchas gracias! – amencarini

+2

Oh, no dije eso, fue más una pequeña puñalada en todas las metaprogramaciones que limitan el uso y el abuso la mayor parte del tiempo. La mayoría de las veces soy el culpable en eso ... ;-) –

-1

Quizás puedas rescue un error constante indefinido y cargar/crear tus clases.

14

No sé si esto es nuevo, pero como pensaba que era la pena añadir. Es posible utilizar el método que falta como método de clase

class Example 
    def method_missing(method_name, *arguments, &block) 
    puts 'needs this instance method' 
    end 

    def self.method_missing(method_name, *arguments, &block) 
    puts 'needs this class method' 
    end 
end 
+1

Probado, esta parece ser la respuesta correcta. – nurettin

Cuestiones relacionadas