2013-05-27 3 views
0

Как создать следующую модель в Rails 3.2? В проекте могут быть 1+ владельцев и 1+ пользователей. Оба они являются экземплярами класса Person. Я думал о has_and_belongs_to_many, но я не знаю, как обрабатывать две отдельные коллекции Персон для каждого Проекта.Названо многими из многих отношений в Rails

ответ

0

Вам потребуется объединение модели для представления каждых has-and-belongs-to-many отношений, и вы бы получить доступ с помощью has-many-through, как описано here:

class ProjectOwnerLink < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :owner, class_name: 'Person' 
end 

class ProjectUserLink < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :user, class_name: 'Person' 
end 

class Project < ActiveRecord::Base 
    has_many :project_owner_links 
    has_many :owners, :through => :project_owner_links 
    has_many :project_user_links 
    has_many :users, :through => :project_user_links 
end 

class Person < ActiveRecord::Base 
    has_many :project_owner_links 
    has_many :owned_projects, :through => :project_owner_links, :source => :project 
    has_many :project_user_links 
    has_many :used_projects, :through => :project_user_links, :source => :project 
end 
0

Вы можете определить другую модель Participation, удерживающую тип отношений, т.е. роль пользователя. (Непроверенная) Код:

class Project < ActiveRecord::Base 
    has_many :participations 
    has_many :users, :through => :participations 

    def with_role(role) 
    includes(:participations).where('participation.role = ?', role) 
    end 

    def owners 
    users.with_role('owner') 
    end 

    def participants 
    users.with_role('participant') 
    end 
end 

class User < ActiveRecord::Base 
    has_many :participations 
    has_many :projects, :through => :participations 

    def with_role(role) 
    includes(:participations).where('participation.role = ?', role) 
    end 

    def projects_owned 
    projects.with_role('owner') 
    end 

    def projects_participating_in 
    projects.with_role('participant') 
    end 
end 

class Participation < ActiveRecord::Base 
    # has an attribute 'role' 

    belongs_to :project 
    belongs_to :user 
end 
Смежные вопросы