2017-06-24 2 views
1

Angenommen, ich schreibe ein einfaches Spiel in Ruby auf Schienen.Schienen verbinden mehrere Modelle mit mehreren Modellen

Also ich habe ein Spielermodell und ein Spielmodell. Jedes Spiel hat zwei Spieler. Und jeder Spieler kann viele Spiele haben (weil sie mehrere Spiele spielen können).

Was ist der effektivste Weg, um zu speichern, welche zwei Benutzer zu einem Spiel gehören? Ich könnte Felder wie player_one_id:integer und player_two_id:integer machen, aber das fühlt sich ein wenig hacky. Und dann nachschlagen, in welchen Spielen ein Spieler gerade ist, wäre nicht effizient.

Was ist der beste Weg, um so etwas zu erreichen? . Im Idealfall sind sie sauber gespeichert und ich kann leicht überprüfen, um zu sehen, was für ein Spiel ein Spieler ist derzeit in

Antwort

3

Ich würde zwei Spieler Spalten verwenden, wie Sie vorschlagen (dh player_one_id und player_two_id) und stellen Modellbeziehungen wie folgt aus:

class Game < ApplicationRecord 
    belongs_to :player_one, class: "Player" 
    belongs_to :player_two, class: "Player" 
end 

class Player < ApplicationRecord 
    has_many :games 
end 

Ich glaube nicht, dass es hacky überhaupt ist, da Sie immer zwei Spieler für jedes Spiel haben werden.

Was aufzublicken, welche Spiele ein Spieler ist derzeit in, können Sie es wie dies tun könnte:

Game.where("player_one_id = ? OR player_two_id = ?", player_id, player_id) 
+0

Das scheint ziemlich glatt! Ich werde es versuchen! Danke für die Hilfe –

-1

Sie haben eine "player_one" Tisch ...

player_one 
----------- 
(PK) player_one_id 
EngineerName 

Und eine "player_two" -Tabelle ...

Sie fügen jetzt eine Verknüpfungstabelle hinzu, die aufgerufen wird „Games“ (oder ähnlich), die die Ids sowohl der player_one verweist und player_two ...

Games 
------------------ 
(PK) GameId 
(FK) player_one_id 
(FK) player_two_id 

Also auf diese Weise, Sie halten alle Player One-Details und der Spieler zwei Details separat und verknüpfen sie nur mit so etwas wie dies die Ids ... würden die Verknüpfungstabelle schauen ...

player_one | player_two 
------------+---------- 
     1  | 1 
     1  | 2 
     1  | 3 
     2  | 1 
     2  | 2 
     2  | 3 

Dies ist am beste Praxis und es gibt Ihnen die Gelegenheit zur Expansion.

Verwandte Themen