2010-08-17 17 views
13

Actualmente estoy trabajando en una aplicación de Rails 3 que parece necesitar la herencia de la Tabla de Clase para un par de modelos.Herencia de Tabla de Clase en Rails 3

Un ejemplo simplificado de lo que está pasando es esto.

Tengo una clase llamada Persona con atributos generales como nombre, correo electrónico, contraseña, que son comunes a todo tipo de personas en la aplicación y se usan para la autenticación.

Hay dos subclases para Persona (o dos tipos de personas ...), Conductor y Pasajero. Ambas subclases comparten los atributos genéricos de Persona pero luego tienen atributos adicionales específicos que son únicos para ellos mismos. (por ejemplo, un controlador puede tener muchos vehículos y licencias, pero un pasajero no)

¿Cómo implementaría CTI para este tipo de situación? He estado buscando en un ejemplo proporcionado aquí:

http://rhnh.net/2010/08/15/class-table-inheritance-and-eager-loading

Pero no especula sobre cómo acceder a los atributos comunes de una persona de un objeto conductor o del pasajero y yo soy un poco confundido por ese.

En particular, lo que me gustaría saber es:

Si estoy actualizando los atributos de un conductor, ¿cómo puedo acceder y actualizar los atributos correspondientes en la tabla de parent? ¿Tengo que engancharme en una devolución de llamada after_save y separar qué actualización de atributo va a dónde? ¿O hay una mejor manera de abordar esto?

+0

Debo añadir que este es un ejemplo simplificado de lo que realmente está sucediendo en mi aplicación. Estoy seguro de que necesito implementar la herencia de tabla de clase en mi situación, la herencia de tabla única no sería la mejor manera. –

+0

Puse un comentario en el blog al que me referí en mi pregunta y el autor amablemente proporcionó un ejemplo de una forma de hacerlo: http://rhnh.net/2010/08/17/updating-class-table-inheritance- tablas (¡Rock, Xavier!) –

Respuesta

5

¿por qué no utilizar la herencia de tabla única? por ejemplo:

class Person < ActiveRecord::Base 
    # some common code here 
end 

class Driver < Person 
    # Driver code 
end 

class Passenger < Person 
    # Passenger code 
end 

de esta manera tendrá una persona de clase común, además de dos clases específicas derivadas de ella

+13

Nota: el OP preguntó sobre cómo usar la herencia de tabla de clase, no sobre la herencia de tabla única. –

+21

a veces la gente pregunta por la incorrecta, simplemente respondí una posible solución a su problema. –

+9

Entonces debe sugerirse como comentario. – EdMelo

4

estoy usando el plugin de herencia tabla de clase y que funcione bien, http://github.com/brunofrank/class-table-inheritance

+0

¡Gracias por la sugerencia, verifico el plugin! –

+4

No es la mejor solución, porque no funciona bien con postgres (es decir, no use esto si tiene la intención de usar heroku con postgres) – standup75

2

Recientemente realicé un prometedor proyecto para implementar herencia de tablas múltiples y herencia de clases en Rails. Pasé unos días sometiéndolo a un rápido desarrollo, correcciones, comentarios y documentación, y lo relancé como CITIER (Inverencia de clase y Embeddings de herencia de tabla para raíles).

Creo que podría combinarlo con las respuestas anteriores?

Considere dándole un aspecto: http://peterhamilton.github.com/citier

Miré a soluciones como el repositorio de clase-table-herencia, pero esto es mucho más limpio y más lógica de la OMI.

También es compatible con los principales lenguajes SQL SQLite, MySQL, PostgreSQL y probablemente más, pero no los he probado.

+0

Esta joya parece ser la característica más completa de las tres. ¿Puedo preguntar si ha analizado la comparación de rendimiento? Y también la integración con Sunspot (ya que se utilizan vistas db)? – lulalala

+0

Funciona muy bien ... pero nos encontramos con un montón de problemas con heroku. No me gustaron las vistas de la tabla, especialmente cuando empuja/tira de la base de datos. Terminó quitándolo. – Ricky

7

También hay un plugin 'acts_as_relation' para hacer esto,
https://github.com/hzamani/acts_as_relation/

en su caso, el código será la siguiente:

class Driver < ActiveRecord::Base 
    acts_as :person 
end 

class Passenger < ActiveRecord::Base 
    acts_as :person 
end 

No se olvide de añadir person_type y columnas para person_idpersons tabla.
Ahora tanto el Conductor como el Pasajero heredan los atributos, las validaciones y los métodos de las personas.