2016-05-06 35 views
0

我有兩個模型:GamePlayerRails模型設計一個特殊成員

class Game < ActiveRecord::Base 
    has_many :players 
end 

class Player < ActiveRecord::Base 
    belongs_to :game 
end 

在所有屬於遊戲的玩家中,只有一個玩家是首發玩家。

我應該如何設計模型和數據庫模式?

關於誰是比賽首發球員的信息只能在Game

回答

0

如果您確信一個遊戲總會有一個首發球員,並認爲這將不會在未來甚至改變,那麼你可以像下面

的關係
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 

然而,在情況下,如果玩家 - 遊戲是多對多的,我的答案需要改變,並添加到另一個表

0

如果你在談論作爲玩家的人羣,你可能需要一個額外的模型來區分所有玩家和遊戲玩家。玩家可以隨着時間的推移而來回走動,但是你可能想要定義某些特定的事物,例如哪個玩家是首發球員,或者哪個球員是在那場比賽中。

因此,像這樣:

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 

所以的遊戲玩家將只有幾場,

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

然後你就可以說

@game.starting_player 

而且它會返回一個正在開始的單人遊戲

現在,如果在參加團隊運動的情況下,每一方都會有一名首發球員,那麼您需要刪除starting_player方法中的「第一個」呼叫,這會爲您提供2名球員陣容。如果您在玩家身上也有相關的團隊模型,那麼您可以同時獲得這兩個團隊

@games.starting_player.each do |player| 
    # Whatever kind of formulations or front end view code you need 
    player.team.name 
end