9

Ben kurulum aşağıdaki modelleri ile rol tabanlı Geçiş Kontrol sistemi vardır:Modelde koşullu bir ilişki oluşturmak mümkün mü?

  • Rol (STI gibi),
    • UserRole (küresel roller)
    • ProjectRole (proje spesifik roller)
  • Atama (Farklı kaynaklarla Polimorfik)
  • User
  • Proj ect (ödevler için bir kaynak türü olarak)

Kullanıcıların, yalnızca belirli bir UserRole'ı varsa bir projeden sorumlu oldukları kabul edilir. Bu Userrole ismi "projelerinde sorumlu" ve iki Has_many dernekler vardır Kullanıcı modelinde kimliği 2.

sahiptir: responsible_assignments ve responsible_projects. Bu dernekler yalnızca kullanıcı UserRole "projelerden sorumlu" ID 2 ile varsa geçerlidir.

Sorumlu bir ilişki için derleme_ * ilişkilendirmesi kullanıcı modelinde oluşturulabilir ve bu tür bir kurulum için ortak bir yoldur. ilişkilerin

Bu tür sorunları çözmek için en iyi uygulama nedir?

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

bir koşullu dernek tarafından ne anlama geliyor ? Koşullar neler? – Yanhao

+0

Durum: bir kullanıcının kimlik 2 ile bir rolü yoksa, sorumlu_ * ilişkilendirmeler geçerli değil/ayarlanmamalıdır. – tonymarschall

cevap

7

Bu gibi koşulları dernekler içine koyamazsınız. Bu tür şeyler kapsamlarda ele alınır.

Daha fazla bilgi için http://guides.rubyonrails.org/active_record_querying.html#scopes'u okuyun. durumunuza

Örnek,

istiyorsun belirli proje rolü

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 

istiyorsun olan bir kullanıcı altındaki tüm atamaları (kimlikleri) belirli bir proje olan bir kullanıcı altındaki tüm projeler (kimlikleri), aktif olan rol.

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

Bu ilişkilendirmeler, modelin yüklenmesi üzerine oluşturulur. Durumunuz o zaman bilinmemektedir. İstenmeyen kayıtları filtrelemek için yalnızca ilişkilendirmelerdeki koşulları dahil edebilirsiniz.