9

He fijado un sistema de acceso controll basado en roles con los siguientes modelos:¿Es posible crear una asociación condicional en el modelo?

  • Rol (como infecciones de transmisión sexual),
    • UserRole (roles globales)
    • (roles específicos del proyecto)
    • ProjectRole
  • Asignación (polimórfico con diferentes recursos)
  • Usuario
  • Proj ect (como un tipo de recurso para asignaciones)

Los usuarios solo pueden ser responsables de un proyecto si tienen una UserRole específica. Este Userrole es el nombre "responsable de proyectos" y tiene ID 2.

En el modelo de usuario hay dos asociaciones has_many: responsible_assignments y responsible_projects. Estas asociaciones solo son válidas si el usuario tiene la UserRole "responsible for projects" con ID 2.

¿Es posible crear una asociación condicional en el modelo de usuario para la asociación responsible_ * y es esta una forma común de configurar este tipo? de las relaciones?

¿Cuál es la mejor práctica para resolver este tipo de problemas?

class Role < ActiveRecord::Base 
    has_many :assignments 
    has_many :users, :through => :assignments 

class UserRole < Role 

class ProjectRole < Role 

class Assignment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
    belongs_to :resource, :polymorphic => true 

class User < ActiveRecord::Base 
    has_many :assignments 
    has_many :roles, :through => :assignments, 
        :class_name => "UserRole" 
    has_many :responsible_assignments, :class_name => "Assignment", 
            :conditions => { :role_id => 4 }  // specific project role 
    has_many :responsible_projects, :through => :responsible_assignments, 
           :source => :resource, 
           :source_type => 'Project', 
           :conditions => { :status => 1 }   // project is active 
    ... 

class Project < ActiveRecord 
    ... 
+0

¿Qué quiere decir por una asociación condicional ? ¿Cuáles son las condiciones? – Yanhao

+0

La condición es: si un usuario no tiene un rol con id 2, las asociaciones responsible_ * no son válidas/no deberían establecerse. – tonymarschall

Respuesta

7

No se pueden poner tales condiciones en asociaciones. Tales cosas se manejan en alcances.

Lea http://guides.rubyonrails.org/active_record_querying.html#scopes para obtener más información.

Ejemplo para su situación,

Quiere todas las asignaciones (IDS) en virtud de un usuario con un rol determinado proyecto

scope :responsible_users, where('users.role_id = 4') 
scope :select_assignment_ids, select('assignments.id') 
scope :responsible_assignments, joins(:assignments).responsible_users.select_assignment_ids 

Desea que todos los proyectos (IDS), en virtud de un usuario con un proyecto específico papel, que están activos.

scope :active_projects, where('projects.status = 1') 
scope :select_project_ids, select('projects.id') 
scope :responsible_projects, joins(:assignments => :projects).responsible_users.active_projects.select_project_ids 
1

Estas asociaciones se crean al cargar el modelo. Su condición es desconocida en ese momento. Solo puede incluir las condiciones en las asociaciones para filtrar los registros no deseados.

Cuestiones relacionadas