9

Ho installato un sistema di accesso controll ruolo in base con i seguenti modelli:È possibile creare un'associazione condizionale nel modello?

  • ruolo (come STI),
    • UserRole (ruoli globali)
    • (ruoli specifici di progetto)
    • ProjectRole
  • Assegnazione (Polimorfa con risorse diverse)
  • Utente
  • Proj ect (come un tipo di risorsa per incarichi)

Gli utenti possono essere responsabili di un progetto solo se hanno un UserRole specifico. Questo Userrole è il nome "responsabile dei progetti" e ha l'ID 2.

Nel modello Utente ci sono due associazioni has_many: responsible_assignments e responsible_projects. Queste associazioni sono valide solo se l'utente ha il UserRole "responsabile dei progetti" con ID 2.

E 'possibile creare un'associazione condizionale nel modello utente per associazione responsabile_ * ed è un modo comune per configurare questo tipo delle relazioni?

Qual è la migliore pratica per risolvere questo tipo di problemi?

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

Cosa vuoi dire da un'associazione condizionale ? Quali sono le condizioni? – Yanhao

+0

La condizione è: se un utente non ha un ruolo con id 2, le associazioni responsabile_ * non sono valide/non dovrebbero essere impostate. – tonymarschall

risposta

7

Non è possibile inserire tali condizioni nelle associazioni. Tali cose sono gestite in ambiti.

Leggi http://guides.rubyonrails.org/active_record_querying.html#scopes per ulteriori informazioni.

Esempio per la vostra situazione,

Volete tutte le assegnazioni (IDS) sotto un utente con un ruolo specifico progetto

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 

Si desidera che tutti i progetti (IDS), sotto un utente con un progetto specifico ruolo, che sono attivi.

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

Queste associazioni vengono create al caricamento del modello. La tua condizione è sconosciuta in quel momento. È possibile includere solo le condizioni nelle associazioni per filtrare i record indesiderati.