9

mam konfiguracja systemu dostępu Controll rola opiera się z następujących modeli:Czy można utworzyć skojarzenie warunkowe w modelu?

  • Rola (jako STI),
    • UserRole (globalne role)
    • (specyficzne role projektowe)
    • ProjectRole
  • Przypisanie (Polimorficzne z różnymi zasobami)
  • Użytkownik
  • Proj ect (jako jeden typ zasobów dla przydziałów)

Użytkownicy mogą ponosić odpowiedzialność za projekt, jeśli mają określoną UserRole. Ta Userrole jest nazwą "odpowiedzialną za projekty" i ma identyfikator 2.

W modelu użytkownika istnieją dwa skojarzenia has_many: odpowiedzialne_wymiary i odpowiedzialne_projekty. Ta asocjacja jest ważna tylko wtedy, gdy użytkownik ma "Role użytkownika" odpowiedzialny za projekty "o identyfikatorze 2.

Czy można utworzyć skojarzenie warunkowe w modelu użytkownika dla powiązania_odpowiedzialnego * i czy jest to popularny sposób konfigurowania tego rodzaju stosunków?

Jaka jest najlepsza praktyka rozwiązywania tego rodzaju problemów?

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

Co masz na myśli przez stowarzyszenie warunkowego ? Jakie są warunki? – Yanhao

+0

Warunek: jeśli użytkownik nie ma roli o identyfikatorze 2, powiązania_odpowiedzi_ * są nieprawidłowe/nie powinny być ustawione. – tonymarschall

Odpowiedz

7

Nie można umieścić takich warunków w skojarzeniach. Takie rzeczy są obsługiwane w zakresach.

Przeczytaj http://guides.rubyonrails.org/active_record_querying.html#scopes, aby uzyskać więcej informacji.

Przykład sytuacji,

Chcesz wszystkie zadania (IDS) pod użytkownika o szczególnej roli projektu

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 

chcesz, aby wszystkie projekty (IDS), pod użytkownikowi konkretnego projektu rola, które są aktywne.

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

Te powiązania powstają podczas ładowania modelu. Twój stan jest nieznany w tym czasie. Można zawrzeć tylko warunki w skojarzeniach, aby odfiltrować niechciane rekordy.

Powiązane problemy