2011-02-17 26 views
17

Estoy intentando crear una instancia de un objeto de la clase AR abstracta con fines de prueba. El modelo de define así:Rails 3 Objetos abstractos de ActiveRecord

class Basic < ActiveRecord::Base 
    self.abstract_class = true 

    def stuff 
    raise NotImplementedError 
    end 
end 

Cuando intento Basic.new, me sale:

"Mysql2::Error: Table 'project_development.basics' doesn't exist" 

¿Es un comportamiento normal? ¿Las clases AR abstractas no están destinadas a ser instanciadas incluso sin (obviamente imposible) persistencia?

Usando 1.9.2-p136 con Rails 3.0.4/0.2.6 mysql2

Editar:

Resulta que el error es causado por definiciones de columna, que en el caso de una el modelo abstracto no se puede recuperar de la base de datos.

class Basic < ActiveRecord::Base 
    self.abstract_class = true 
    @columns = [] 
end 

Funciona como un encanto.

+0

A los programadores de Ruby no les gustan las clases abstractas. ¿Incluir módulos no funciona para usted? http://stackoverflow.com/questions/512466/how-to-implement-an-abstract-class-in-ruby – tokland

+2

@tokland; De Verdad? Tendría que estar en desacuerdo con eso. Las clases abstractas son muy útiles y se usan con mucha frecuencia. 'ActiveRecord :: Base' es una clase abstracta, por ejemplo. Sin embargo, estoy de acuerdo en que la forma en que algunas personas usan clases abstractas podría ser mejor servida mediante el uso de módulos. – idlefingers

+0

@idlefingers. Lo siento, fue una afirmación demasiado audaz, de hecho, las clases abstractas pueden ser útiles en ciertos escenarios. – tokland

Respuesta

20

Esto es comportamiento normal. Se supone que las clases abstractas no deben crearse instancias. Debe probar las clases que heredan de la clase abstracta, no la clase abstracta en sí misma.

+0

+1, esto es típico en muchos lenguajes dinámicos. Relacionado: http://stackoverflow.com/questions/4619941/simulating-abstract-classes-in-ruby-rails – tokland

Cuestiones relacionadas