現実の世界では、アスリートとコーチがいるとしましょう。
モデルにはユーザーがいます。ユーザーはアスリートです。現在、ユーザーは他のユーザーのコーチになることもできます。これを最良の方法でどのようにモデル化しますか?
私は切望します:
@user.coach?
=> 真/偽
@user.is_a_coach_of?(other_user)
=> 真/偽
現実の世界では、アスリートとコーチがいるとしましょう。
モデルにはユーザーがいます。ユーザーはアスリートです。現在、ユーザーは他のユーザーのコーチになることもできます。これを最良の方法でどのようにモデル化しますか?
私は切望します:
@user.coach?
=> 真/偽
@user.is_a_coach_of?(other_user)
=> 真/偽
ユーザーがコーチを 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
アスリートとそのコーチの間の関係を表すテーブル (各アスリート/コーチの関係の行) を作成します。ここでは、コーチ ID とアスリート ID の両方がユーザー データに関連付けられています。
CoachID | AthleteID
ユーザーがコーチになることができる場合は、それで十分ですが、「コーチング」を特定のユーザーに制限したい場合は、ユーザー テーブルに「IsCoach」プロパティを追加します。