سؤال

لدي تطبيق له الخصائص التالية

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 النماذج ، ولكن مكالمتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top