belongs_to has_one Struktur
-
30-09-2019 - |
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
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?
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.