2010-10-04 11 views
0

Je suis un débutant de Rails (de PHP). Pardonne donc cette structure de données de base question:Trouver un élément de tableau par id dans Rails

Dans le contrôleur:

@games = Game.all 
@players = Player.all 

De l'avis:

<% @games.each do |game| %> 
    <%= game.player_id %> 
<% end %> 

Lorsque itérer sur les @games, au lieu d'afficher l'identification du joueur avec le jeu. player_id, je voudrais afficher le nom du joueur qui se trouve dans l'objet Player (: name). Comment puis-je «trouver» l'enregistrement de joueur correct par l'identifiant stocké dans game.player_id?

Répondre

4

Dans le contrôleur:

@games = Game.all(:include => :player) 

De l'avis:

<% @games.each do |game| %> 
    <%= game.player.name %>  
<% end %> 

Votre modèle de données semble étrange pour moi. Pour le même problème mon modèle de données pourrait ressembler à ceci:

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 
end 

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

Maintenant, dans le contrôleur, j'interrogerait les jeux:

@games = Game.all(:include => :players) 

Dans la vue:

<%@games.each do |game| %> 
    <% games.players.each do |player| %> 
    <%= player.name %> 
    <%end%> 
<%end%> 

Modifier 1

Si vous avez un concept d'équipe alors, je vais ntroduce le modèle d'équipe:

class Player < ActiveRecord::Base 
    has_many :team_players 
    has_many :teams, :through => :team_players 
end 

class TeamPlayer < ActiveRecord::Base 
    belongs_to :player 
    belongs_to :team 
end 

class Team < ActiveRecord::Base 
    has_many :team_players 
    has_many :players, :through => :team_players 
    belongs_to :game 
    # attributes name, score team size constraints etc. 
end 

class Game 
    has_many :teams 
    has_many :players, :through => :teams. 
end 

Ajout d'un nouveau jeu:

@game = Game.new 

@team_a = @game.teams.build(:name => "Foo") 
@team_a.players << Player.find_all_by_name(["John", "Grace"]) 

@team_b = @game.teams.build((:name => "Bar") 
@team_b.players << Player.find_all_by_name(["Kelly", "Yuvan"]) 

@game.save 

Alors que l'interrogation des jeux dans votre contrôleur:

@games = Game.all(:include => [{:teams => :players}]) 

À votre avis:

<%@games.each do |game| %> 
    <% games.teams.each do |team| %> 
    <% team.players.each do |team| %> 
     <%= player.name %> 
    <%end%> 
    <%end%> 
<%end%> 
+0

Merci pour avoir pris le temps de regarder dans mon modèle de données. Comment contraindriez-vous les joueurs à certaines positions dans le jeu? Si c'est un match de tennis en double, vous avez deux joueurs dans chaque équipe qui s'affrontent. Le jeu aurait un score pour chaque équipe. – Etienne

+0

Mis à jour la réponse, jetez un oeil. –

+0

C'est génial. Une dernière question liée à Rails. Considérant que j'ai fait fausse route avec mon modèle et les migrations associées, comment refait-on quelque chose? Est-ce que je crée simplement une nouvelle migration qui corrige le schéma pour supporter de nouveaux modèles ou est-ce que je supprime des migrations existantes et en crée de nouvelles? – Etienne

Questions connexes