Модельные команды - PullRequest
       8

Модельные команды

1 голос
/ 19 июня 2009

Я просто хотел получить отзывы о лучших способах моделирования членства команды / команды в рельсах.
В настоящее время у меня есть следующее:

class User
    has_many :teams, :foreign_key => "owner_id" #user owns this team
    has_many :memberships #user is a member of these teams


class Team
    belongs_to :team_administrator, :class_name => "User", :foreign_key => "owner_id"
    has_many :memberships

class Membership
    belongs_to :team
    belongs_to :user

Мне не нравится роль администратора команды, потому что я должен утверждать, что он и в членстве, и что он владеет командой. Может быть, было бы лучше иметь свойство is_administrator Membership?

Другая проблема с этой моделью заключается в том, что я пытаюсь найти хороший способ определить, является ли UserA членом команды, которой владеет UserB. Я сейчас делаю:

Membership.first(:joins => :team, :conditions => {:id => params[:membership_id], :teams => {:owner_id => current_user}})

Где members_id - членство, содержащее пользователя, которого я пытаюсь определить, является членом команды, принадлежащей current_user.

Так, у кого-нибудь есть лучший способ смоделировать это?

Спасибо за любой совет!

Редактировать: Пользователь действительно может быть владельцем / членом нескольких команд

Ответы [ 2 ]

4 голосов
/ 19 июня 2009

Что вам нужно, так это полиморфизм:

class User
    has_many :teams, :as => team_administrator, :foreign_key => "owner_id"
    has_many :teams, :through => :memberships #user is a member of these teams
    has_many :memberships

class Team
    belongs_to :team_administrator, :polymorphic => true, :foreign_key => "owner_id"
    has_many :users, :though => memberships

class Membership
    belongs_to :team
    belongs_to :user

Чтобы узнать, является ли пользователь A частью команды B:

b = User.find_by_name("B")
a = User.find_by_name("A")
a.teams.find_by_owner_id(b.id)
1 голос
/ 19 июня 2009

найди членство другим способом

@membership = current_user.membership.find(params[:membership_id], :joins => :team)
...