2011-10-11 14 views
5

Tengo un modelo de usuario. Los usuarios pueden tener 1 de 3 roles: role1, role2, role3. Esto se representa mediante una columna de 'rol' en el modelo de usuario. Cada función tiene un perfil único. role1_profile, role2_profile, role3_profile. Cada * _profile es un modelo.Asociaciones de modelos opcionales o condicionales en Rails

¿Cómo puedo representar esta asociación opcional en Rails?

Lo he intentado dos maneras diferentes:

class User < ActiveRecord::Base 
    #FIRST WAY 
    if current_user.role == 'role1' then has_one :role1_profile end 
    #SECOND WAY 
    has_one :role1_profile, :conditions => ['user.role = ?', 'role1'] 
end 

Pero eso no funciona. ¿Cuál es la forma correcta de hacer esto?

Respuesta

4

Las asociaciones no están destinadas a ser condicionales. Probablemente sea más fácil mantener las cosas así también.

¿Qué tal tener una asociación polimórfica entre User y los distintos perfiles de roles?

class User 
    belongs_to :role_profile, :polymorphic => true 
end 

class RoleXProfile 
    has_many :users, :as => :role_profile 
end 

Por supuesto, habría que añadir los campos role_profile_id y role_profile_type a su tabla de usuarios.

No importa lo que haga, deberá verificar el rol del usuario o role_profile donde sea que lo use.

+0

+1 porque era demasiado flojo para escribir el código. –

+0

¡Gracias! Creo que tu solución es perfecta. Siempre hay un camino en Rails, pero cuando no conoces el camino, tiendes a implementar una solución de una manera extraña. – hrdwdmrbl

+0

@jackquack No creo que tu enfoque fuera extraño en absoluto. Todo lo contrario, fue muy lógico. Y bien puede señalar un lugar donde ActiveRecord se puede mejorar/ampliar. De todos modos, me alegro de que las cosas funcionen. –

4

En su lugar, le conviene considerar un polymorphic association y simplemente tener los perfiles de función adecuados.

Lo que entendí fue que :conditions eran condiciones que el modelo asociado debe cumplir (pero podría estar equivocado en eso).

En cualquier caso, creo que estás haciendo esto más difícil de lo que realmente es y ofuscando lo que realmente necesitas al condicionar estas relaciones.

+0

+1 porque un programador perezoso es un buen programador :) y por la nota sobre las condiciones utilizadas para las asociaciones –

+0

@WizardofOgz ¡Eso es lo que le digo a mi jefe! Creo que fue ... ¿Hamlet? quien dijo "De la pereza viene la innovación". –

+0

¡Tienes toda la razón! Acabo de darle a Wizard la credibilidad desde que incluyó el código. :) – hrdwdmrbl

Cuestiones relacionadas