Frage

Ich habe eine Anwendung, die die folgenden Eigenschaften

There are Clubs
Each Club has Teams
Each Team has Players

ich eine Benutzer-Tabelle haben. Die Benutzertabelle im Grunde enthält den Benutzernamen und das Passwort für den Club-Manager, Teamleiter und dem Spieler die Anmeldung am System.

Wie soll ich die Modelle strukturieren und die Tabellen?

Ich plane Tabellen für Club-Team und Spieler zu erstellen. Aber ich bin nicht sicher, ob die Beziehung zwischen ihnen und der Benutzer-Tabelle zu strukturieren.

kann ich user_id in jedem Modell erstellen, aber die Beziehung Club belongs_to User sein würde, die nicht richtig zu sein scheint. Außerdem würde ich mit einem User-Modell am Ende, das die folgenden

hat
has_one :club
has_one :team
has_one :player

Was ist nicht richtig. Ein Benutzer wird nur einer von ihnen zu einem bestimmten Zeitpunkt haben.

Gibt es einen besseren Weg, diese zu strukturieren?

War es hilfreich?

Lösung

Unter Rails ist has_one wirklich „hat höchstens einen“. Es ist durchaus möglich, alle drei has_one Dekorateure in User zu haben. Wenn Sie sicherstellen wollen, nur genau eine sie haben, können Sie eine Validierung hinzufügen, zum Beispiel:

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

Da haben Sie die Möglichkeit, die Benutzer-Tabelle in der Datenbank zu ändern, ich denke, ich club_id, team_id, player_id in users setzen würde, und haben die folgende:

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

Ich würde sogar versucht sein, User als Manager zu umbenennen, oder haben has_one :manager, :class_name => "User" in den Club, Team und Player Modellen, aber Ihr Anruf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top