2009-06-19 3 views
1

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

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 членом команды, которой владеет Пользователь. Я в настоящее время делаю:

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

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

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

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

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

+0

Если у пользователей только одна команда, вам действительно не нужна таблица/модель членства. если членство не является тем местом, где вы храните информацию об этом пользователе по отношению к команде, тогда да, вы должны сохранить is_administrator там – ErsatzRyan

+0

Возможно, я должен был сделать это ясно, пользователь может мне стать членом/владельцем нескольких команд. – neiled

ответ

1

найти членского состава в другую сторону

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

Спасибо, но на самом деле, в этом случае идентификатор членства является идентификатором членства между пользователем и командой, а не владельцем и командой, поэтому он не будет работать. – neiled

4

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

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)