我有兩個模型:Game
和Player
。Rails模型設計一個特殊成員
class Game < ActiveRecord::Base
has_many :players
end
class Player < ActiveRecord::Base
belongs_to :game
end
在所有屬於遊戲的玩家中,只有一個玩家是首發玩家。
我應該如何設計模型和數據庫模式?
關於誰是比賽首發球員的信息只能在Game
?
我有兩個模型:Game
和Player
。Rails模型設計一個特殊成員
class Game < ActiveRecord::Base
has_many :players
end
class Player < ActiveRecord::Base
belongs_to :game
end
在所有屬於遊戲的玩家中,只有一個玩家是首發玩家。
我應該如何設計模型和數據庫模式?
關於誰是比賽首發球員的信息只能在Game
?
如果您確信一個遊戲總會有一個首發球員,並認爲這將不會在未來甚至改變,那麼你可以像下面
的關係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
然而,在情況下,如果玩家 - 遊戲是多對多的,我的答案需要改變,並添加到另一個表
如果你在談論作爲玩家的人羣,你可能需要一個額外的模型來區分所有玩家和遊戲玩家。玩家可以隨着時間的推移而來回走動,但是你可能想要定義某些特定的事物,例如哪個玩家是首發球員,或者哪個球員是在那場比賽中。
因此,像這樣:
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