Вот модель данных, которую я бы предложил для этого:
class Project < ActiveRecord::Base
has_many :memberships, :dependent => :destroy
...
end
class Membership < ActiveRecord::Base
belongs_to :project
belongs_to :user
...
end
class User < ActiveRecord::Base
has_many :memberships, :dependent => :destroy
has_many :projects, :through => :memberships
...
end
И тогда таблица членства будет иметь следующие атрибуты:
:id
:user_id
:project_id
:is_owner (boolean)
Область действия, определенная для класса членства:
scope :owner, where("is_owner")
И специальный метод для пользовательских экземпляров:
def owned_projects
memberships.owner.includes(:projects).inject([]) {|array, m| array << m.project; array}
end
позволит вам получать проекты, принадлежащие пользователю, с помощью вызова user.owned_projects.
И простовызов user.projects для просмотра проектов пользователя, с которыми они либо сотрудничают, либо владеют.
У вас улучшена нормализация данных с помощью этой модели данных и простой логический атрибут, позволяющий определить, является ли пользователь проектом или нет.владелец.
Эта модель данных используется в этом проекте , за исключением s / Project / Group /, и есть некоторые дополнительные функции для обработки приглашения пользователей в Project.
Это не отвечает на ваш «реальный вопрос», но я думаю, что отчасти проблема заключается в том, что модель данных, где соавторы являются владельцами, хранятся в одной таблице, чтобы минимизироватьИзбыточности и необходимость управления двумя отдельными таблицами.