2010-05-17 16 views

Respuesta

0

En la comprobación de la función de inicialización que la clase es la clase base de ITS.

Aunque la pregunta es ¿por qué querrías exactamente hacer esto? Parece más probable que probar un diseño diferente te pueda ayudar más.

-4

Puede hacer self.abstract_class = true en la clase base para decirle a ActiveRecord que es una clase abstracta.

3

Puede probar esto:

class BaseClass 
    def initialize 
    raise "BaseClass cannot be initialized" if self.class == BaseClass 
    end 
end 

class ChildClass 
end 

el resultado será:

a = BaseClass.new # Runtime Error 
b = ChildClass.new # Ok 

Espero que ayude

+1

Dado que BaseClass probablemente descenderá de ActiveRecord :: Base, initialize probablemente deba llamar a super. – Douglas

40

La respuesta de John Topley es realmente malo. Establecer abstract_class = true en la clase base hará que las clases secundarias dejen de configurar su tipo automáticamente. Además, a menos que configure set_table_name en la clase base, las clases secundarias se quejarán de que su tabla no existe.

Esto se debe a que el objetivo de abstract_class = true es configurar la herencia cuando NO está utilizando STI y desea tener una clase abstracta (clase no respaldada por una tabla db) en su jerarquía de clases entre ActiveRecord :: Base y una o más clases modelo.

Tener initialize raise es una solución, también agregar validates_presence_of: type a la clase base es una solución.

Nota Si anular initialize, tiene que llamar súper:

def initialize(*args) 
    raise "Cannot directly instantiate an AbstractUser" if self.class == AbstractUser 
    super 
end 
+0

¿Por qué esta respuesta no está en la parte superior de las respuestas? Se sienta debajo de una respuesta con 0 votos y otra que fue eliminada. –

0

A menudo prefiero simplemente hacer que el método new clase privada con:

class Base 
    private_class_method :new 
end 

De esta manera instanciación accidental de la La clase base desencadena un error, pero aún es posible crear una instancia con Base.send(:new) para escribir pruebas para la clase Base.

Cuestiones relacionadas