ينتمي إلى هيكل HAS_ONE
-
30-09-2019 - |
سؤال
لدي تطبيق له الخصائص التالية
There are Clubs Each Club has Teams Each Team has Players
لدي جدول المستخدمين. يحتوي جدول المستخدم بشكل أساسي على اسم المستخدم وكلمة المرور لمدير النادي ومدير الفريق واللاعب لتسجيل الدخول إلى النظام.
كيف يمكنني هيكلة النماذج والجداول؟
أخطط لإنشاء طاولات للنادي والفريق واللاعبين. لكنني لست متأكدًا من إظهار هيكل العلاقة بينهما وبين جدول المستخدمين.
يمكنني خلق user_id
في كل نموذج من النموذج ، ولكن العلاقة ستكون Club belongs_to User
الذي لا يبدو صحيحا. علاوة على ذلك ، سوف ينتهي بي الأمر مع نموذج المستخدم الذي يحتوي على ما يلي
has_one :club
has_one :team
has_one :player
وهو ليس صحيحًا. سيكون لدى المستخدم واحد منهم فقط في أي وقت معين.
هل هناك طريقة أفضل لتنظيم هذا؟
المحلول
تحت القضبان ، has_one
هو حقا "لديه واحد على الأكثر". إنه صحيح تمامًا للحصول على الثلاثة has_one
ديكور في User
. إذا كنت ترغب في التأكد من أن لديهم واحدة فقط ، فيمكنك إضافة التحقق من الصحة ، على سبيل المثال:
class User < ActiveRecord::Base
has_one :club
has_one :team
has_one :player
validate :has_only_one
private
def has_only_one
if [club, team, player].compact.length != 1
errors.add_to_base("Must have precisely one of club, team or player")
end
end
end
نظرًا لأن لديك القدرة على تغيير جدول المستخدمين في قاعدة البيانات ، أعتقد أنني سأضع club_id
, team_id
, player_id
في users
, ولديها ما يلي:
class Club < ActiveRecord::Base
has_one :user
has_many :teams
has_many :players, :through => :teams
end
class Team < ActiveRecord::Base
has_one :user
belongs_to :club
has_many :players
end
class Player < ActiveRecord::Base
has_one :user
belongs_to :team
has_one :club, :through => :team
end
class User < ActiveRecord::Base
belongs_to :club
belongs_to :team
belongs_to :player
validate :belongs_to_only_one
def belongs_to_only_one
if [club, team, player].compact.length != 1
errors.add_to_base("Must belong to precisely one of club, team or player")
end
end
end
حتى أنني أميل إلى إعادة تسمية User
كما Manager
, ، أو لديك has_one :manager, :class_name => "User"
في ال Club
, Team
و Player
النماذج ، ولكن مكالمتك.