2009-03-06 30 views
5

Esto es lo que estoy tratando de lograr: tengo una tabla de usuarios y cada usuario puede ser de una docena de tipos: actor, bailarín, director, ... que se determina después de iniciar sesión. Cada tipo de usuario puede tener cualquier cantidad de perfiles. P.ej. los actores pueden tener cualquier número de actores_perfil, los bailarines pueden tener cualquier número de perfil_dancer, ...Ruby on Rails asociación polimórfica

El problema es cómo puedo vincular el perfil con el usuario. Una solución obvia sería crear una tabla adicional para cada tipo de perfil, de forma que pueda usar un elemento perteneciente polimórfico perteneciente a User y luego un simple belongs_to en cada perfil, pero eso parece menos que óptimo. Una forma posiblemente mejor sería decir a rails que el usuario es de tipo actor, de modo que user.profiles funcionaría naturalmente, sin ningún tipo de desorden. ¿Apoyan los raíles tal comportamiento, o hay algo mejor que el método anterior? Gracias.

Respuesta

1

definir las relaciones de las subclases: Respuesta

class User < ActiveRecord::Base 
end 

class Actor < User 
    has_many :profiles, :class_name => "ActorProfile" 
end 

class Dancer < User 
    has_many :profiles, :class_name => "DancerProfile" 
end 
3

de PJB utiliza individual herencia de tabla. Para que esto funcione, debes agregar una columna llamada tipo a tus Usuarios y a tus tablas de Perfiles *, para que Rails pueda guardar qué tipo de Usuario es (ya que Actor, Bailarín, etc. son solo subclases de Usuario).

Esto significa que se guardarán todas en las tablas de usuarios/perfiles, pero cuando las cree, ActiveRecord las creará como el tipo correcto. Con esto, usted será capaz de llamar

User.find 

sino también hacer cosas como

Actor.find, Actor.all, etc 

y tenerlo como alcance únicos actores

Google rails single table inheritance para más detalles y ejemplos.

  • Por supuesto que había necesidad de declarar su Perfil de subclases de la misma manera que declaró su usuario subclases

clase Perfil < ActiveRecord :: Base belongs_to: usuario final ActorProfile

clase < Perfil final

clase DancerProfile < Perfil final

etc

0

Tendrá que asegurarse de que su mesa usuario tiene una columna denominada "tipo". Rails guardará el TYPE de la clase (usuario, actor, etc.) en ese campo de base de datos.