2016-05-06 11 views
0

Ich habe zwei Modelle: Game und Player.Schienen Modell Design ein spezielles Mitglied

Unter allen Spielern, die zu einem Spiel gehören, ist nur ein Spieler der Startspieler.

Wie soll ich das Modell und das DB-Schema entwerfen?

Könnte die Information darüber, wer der Startspieler des Spiels ist, nur in Game sein? bei

Antwort

0

Wenn Sie sicher sind, dass ein Spiel immer ein Startspieler haben wird, und dass dies nicht auch in Zukunft nichts ändern, dann könnte man eine Beziehung wie folgt

class Game < ActiveRecord::Base 
    # has the following attributes 
    # starting_player_id:integer:index 

    belongs_to :starting_player, class: Player 
    has_many :players 
end 

class Player < ActiveRecord::Base 
    # has the following attributes 
    # game_id:integer:index 

    has_one :starting_game, foreign_key: :starting_player_id, class: Game 
    belongs_to :game 
end 

jedoch haben, wenn Spieler-Spiel ist viele-zu-viele, meine Antwort muss geändert und mit einer anderen Tabelle hinzugefügt werden

0

Wenn Sie über Teams von Menschen sprechen, die Spieler sind, benötigen Sie möglicherweise ein zusätzliches Modell, um zwischen ALLEN Spielern und Spielteilnehmer. Spieler könnten im Laufe der Zeit kommen und gehen, aber vielleicht möchten Sie bestimmte Dinge definieren können, wie zum Beispiel welcher Spieler der Startspieler war oder welche Spieler überhaupt bei diesem Spiel waren.

So etwas wie folgt aus:

class Player < ActiveRecord::Base 
    has_many :game_players 
    has_many :games, through: :game_players 
end 


class Game < ActiveRecord::Base 
    has_many :game_players 
    has_many :players, through: :game_players 
end 

class GamePlayer < ActiveRecord::Base 
    belongs_to :game 
    belongs_to :player 

def starting_player 
    return GamePlayer.joins(:game).merge(GamePlayer.starting).first.player 
    end 
end 

So Gameplayer nur ein paar Felder haben würde,

game_id (an integer) 
player_id (an integer) 
starting (a boolean) 

Dann würden Sie in der Lage sein

@game.starting_player 

zu sagen Und es würde zurückkehren ein einzelner Spieler, der begann

Jetzt, wenn es ein Mannschaftssport wäre, hättest du auf jeder Seite einen Startspieler, also müsstest du den "ersten" Call in der starting_player Methode entfernen, was dir ein Array von 2 Spielern geben würde. Wenn Sie in einem Player auch ein Teammodell haben, können Sie beide Teams

bekommen