Я делаю нечто подобное с фотогалереей, которая имеет общие разрешения. Вот примерно структура, которую я дал (хотя она адаптирована из другого проекта, поэтому может быть не совсем верной).
class User
has_many :projects, :foreign_key => "owner_id"
has_many :project_memberships, :foreign_key => "member_id"
has_many :shared_projects, :class_name => "Project", :through => :project_memberships, :foreign_key => "member_id"
end
class ProjectMembership
belongs_to :member, :class_name => 'User'
belongs_to :project
end
class Project
belongs_to :owner, :class_name => "User"
has_many :project_memberships
has_many :members, :class_name => "User", :through => "project_memberships", :foreign_key => "member_id"
end
По сути, это позволяет проекту иметь как владельца, который является пользователем, так и группу других участников, которые также являются пользователями, и к ним можно обращаться отдельно как таковые. Они связаны с использованием отношения has_many :through
, и мы в основном даем более осмысленное имя, чем то, что нам дает значение по умолчанию has_many :users
.
Это также дает отдельным членам возможность присоединиться к проекту, создав новый объект project_membership
для указанного проекта, сохраняя при этом одного владельца.