2011-06-21 6 views
22

Si tengo un usuario y quiero hacer diferentes tipos de usuarios, digamos solo usuarios normales con solo un correo electrónico y suscriptores que tienen un campo de sitio web, ¿cómo haría que los suscriptores hereden todo de los usuarios con solo un agregado ¿campo?Rails Model Herencia

Respuesta

26

Debería crear una tabla con todos los campos, así como especificar una columna de tipo. es decir

create_table :users do |t| 
    t.string :email 
    t.string :website 
    t.string :type 
end 

A continuación, puede tener clases como

Class User < ActiveRecord::Base 

Class Subscriber < User 

Un suscriptor heredará todo, desde el modelo usuarios. La columna tipo está allí para que pueda distinguir de los diferentes modelos. Por ejemplo, utilizando

Subscriber.all 

sólo obtener suscriptores, donde como si no utiliza la columna 'tipo' también sería encontrar usuarios también.

+20

OP: Esto se llama "herencia de tabla única" o "STI". Así que busca eso para obtener más información sobre cómo funciona si lo necesitas. – Pavling

+4

Después de hacer un poco de búsqueda de Google sobre el tema, algunos también parecen preferir el uso de asociaciones polimórficas cuando los datos difieren entre los modelos. Esto evita tener una sola tabla con muchos campos nulos. Encontré útil este enlace: http://railscasts.com/episodes/394-sti-and-polymorphic-associations. – rogerkk

+0

¿Qué valor real debería tener la columna de tipo? –

13

Quiere single table inheritance, se describe en el enlace de Alex Reisner. STI usa una sola tabla para representar varios modelos que heredan de un modelo base. En el mundo de Rails, el esquema de la base de datos tiene una columna que especifica el tipo de modelo representado por la fila. Agregar una columna llamada type en una migración de base de datos hace que Rails infiera que la tabla usa STI, aunque la columna puede ser un nombre arbitrario si especifica el nombre en el modelo de datos (consulte class method 'inheritance_column'). Tenga en cuenta que esto hace que type sea una palabra reservada.

+2

Eso está roto. Creo que el enlace correcto es [http://www.alexreisner.com/code/single-table-inheritance-in-rails](http://www.alexreisner.com/code/single-table-inheritance-in-rails) –

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – Luke

+1

@Luke: siempre que la "respuesta única de la tabla" sea la respuesta, eso no es exactamente solo un enlace. –