Можно ли создать условная связь в модели?

Я настроил систему управления доступом на основе ролей со следующими моделями:

  • Роль (как STI),
    • UserRole (глобальные роли)
    • ProjectRole (специфические роли проекта)
  • Assignment (полиморфно с разными ресурсами)
  • User
  • Project (как один тип ресурса для назначений)

Пользователи могут быть только разрешены нести ответственность за проект, если у них есть конкретная UserRole. Эта роль пользователя называется «ответственный за проекты» и имеет идентификатор 2.

В модели пользователя есть две ассоциации has_many: ответственные_ассигнменты и ответственные_проекты. Эти ассоциации действительны только в том случае, если у пользователя есть UserRole «ответственный за проекты» с ID 2.

Можно ли создать условную ассоциацию в пользовательской модели для ассоциации «ответственный_ *» и является ли это обычным способом установки такого рода отношений ?

Как лучше всего решать такие проблемы?

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
  ...
12
задан tonymarschall 7 March 2012 в 17:44
поделиться