Hola a todos,
Trabajando con STI (Single Table Inheritance) me he encontrado con
alguna cosa que otra bastante sorprendente.
Suponiendo la siguiente jerarquÃa:
class Persona < ActiveRecord:Base
end
class Empleado < Persona
end
class Tecnico < Empleado
end
class Auxiliar < Empleado
end
A) Persona.find(:all)
Si hacemos un Persona.find(:all) veremos a todas las personas, es decir,
Todos los Empleados y todos los Técnicos.
B) Tecnico.find(:all)
Si hacemos un Tecnico.find(:all) veremos solo a las personas del tipo
Tecnico.
C) Auxiliar.find(:all)
Si hacemos un Auxiliar.find(:all) veremos solo a las personas del tipo
Auxiliar.
D) Empleado.find(:all)
Si hacemos un Empleado.find(:all) veremos a las personas del tipo
Empleado, pero ¿por qué NO vemos las personas del tipo Tecnico y del
tipo Auxiliar?
Esto deberÃa funcionar.
Solución FEA
He encontrado una forma para hacer que funcione, pero me parece
demasiado “mágica” como para utilizarla con convencimiento:
Fallo
Si en el controlador de Empleado, en la acción ‘list’ pongo:
def list
@empleados = Empleado.find(:all)
end
No veré a los Tecnicos, ni a los Auxiliares en la vista. Sólo veremos a
las personas del tipo Empleado.
OK
Si en el controlador de Empleado, en la acción ‘list’ pongo:
def list
@tecnicos = Tecnico.find(:all)
@auxiliares = Auxiliar.find(:all)
@empleados = Empleado.find(:all)
end
De este modo cuando pongo esto, sà que veré en la vista a las personas
del tipo Tecnico y del tipo Auxiliar, y además… ¡sólo recorriendo el
array @empleados!
DUDA
Tras leer mil sitios en la web, no he encontrado una solución al
problema (si es un problema)
¿Sabéis de algún sitio que explique porqué esto es as�?? ¿lo sabéis
vosotros?
¿Es un bug de rails??
¿Existe alguna solución “más limpia”?? (asà me parece demasiado “feo”)
Gracias por adelantado.
Un saludo!
–
Juan José Vidal [email protected]
ATICA - Universidad de Murcia