Я работаю над приложением, которое имеет модели User
и Project
, и User
можно назначить нескольким Project
с, через ProjectUser
, с ролью (например, Разработчик, Дизайнер).
Project
has_many :project_users
has_many :users, :through => :project_users
User
has_many :project_users
has_many :projects, :through => :project_users
ProjectUser (user_id, project_id, role)
belongs_to :user
belongs_to :project
Я могу позвонить @project.users
и @user.projects
, но, поскольку есть разные роли, я бы хотел быть более конкретным в отношениях.В идеале я хочу иметь возможность сделать следующее:
@project.developers
# returns @project.users, but only where ProjectUser.role = 'Developer'
@project.designers << @user
# creates a ProjectUser for @project, @user with role 'Designer'
@user.development_projects
# returns projects where @user is assigned as a 'Developer'
@user.design_projects << @project
# creates a ProjectUser for @project, @user with role 'Designer'
В настоящее время у меня есть следующий код:
has_many :developers, :through => :project_users, :source => :user,
:class_name => "User",
:conditions => ['project_users.role = ?','Developer']
Но это действительно только выборка в одну сторону, и неМне больше ничего не дадут - я не могу построить, назначить или что-то еще.
Я пытаюсь использовать более сложную логику, которая, как мне кажется, может сработать, но была бы признательна за некоторые указатели:
has_many :developer_assignments, :source => :project_user,
:conditions => { :role => 'Developer' }
has_many :developers, :through => :developer_assignments # class_name?
Есть предложения?Спасибо!