0

現実の世界では、アスリートとコーチがいるとしましょう。

モデルにはユーザーがいます。ユーザーはアスリートです。現在、ユーザーは他のユーザーのコーチになることもできます。これを最良の方法でどのようにモデル化しますか?

私は切望します:

@user.coach?=> 真/偽

@user.is_a_coach_of?(other_user)=> 真/偽

4

2 に答える 2

1

ユーザーがコーチを 1 つしか持てない場合は、ユーザー テーブルにコーチ アソシエーションをユーザー テーブルに戻すことができます。この典型的な例は、すべての従業員がちょうど 1 人のマネージャー (CEO を除く) を持つ従業員テーブルです。

class User
  has_one :coach, :class_name => "User"
  has_many :coachees, :foreign_key => :coach_id, :class_name => "User"

  def coach?
    0 < coachees.count
  end

  def is_a_coach_of?(other_user)
    coachees.include?(other_user)
  end
end

ユーザーが多くのコーチを持つ可能性がある場合は、コーチ テーブルを使用し、フィールド user_id (コーチ用) と、コーチするユーザー用の Coachee_id を使用します。

class Coach
  belongs_to :user
  belongs_to :coachee, :class_name => "User"
end

class User
  has_many coaches, :foreign_key => :coachee_id
  has_many coach_users, :through => :coachs, :source => :user
  has_many coachees, class_name => "Coach"
  has_many coachee_users, :through => :coachees, :source => :coachee

  def coach?
    0 < coachees.count
  end

  def is_a_coach_of?(other_user)
    coachee_users.include?(other_user)
  end
end
于 2012-09-13T20:23:33.087 に答える
0

アスリートとそのコーチの間の関係を表すテーブル (各アスリート/コーチの関係の行) を作成します。ここでは、コーチ ID とアスリート ID の両方がユーザー データに関連付けられています。

CoachID | AthleteID

ユーザーがコーチになることができる場合は、それで十分ですが、「コーチング」を特定のユーザーに制限したい場合は、ユーザー テーブルに「IsCoach」プロパティを追加します。

于 2012-09-13T20:10:39.790 に答える