0

各プレイヤーには多くのゲームがあり、各ゲームには多くのプレイヤーがいます。プレイヤーはゲームに行くか行かないかを選択できます。

Game
 has_many :shows
 has_many :players, :through => :shows

Player
 has_many :shows
 has_many :games, :through => :shows

Show Migration
  t.references :game
  t.references :player
  t.boolean :going, :default => false

私がやりたいことは、プレーヤーがゲームに行くことを決定した場合に、going を true に設定することだけですが、これを実現する最善の方法は何ですか?

4

1 に答える 1

1

player_idプレーヤーの ID ( ) と特定のゲームの ID ( )がわかっていると仮定するとgame_id、次のことができます。

Show.where('player_id = ? and game_id = ?', player_id, game_id).first.update_attributes(:going => true)

これはより冗長ですが、次のことも可能です。

player = Player.find(player_id)
show = player.shows.find_by_game_id(game_id)
show.update_attributes(:going => true)

ゲームを反復したい場合は、次のことができます。

player = Player.find(id_of_player)

player.shows.each do |show|
  if show.game == ... # condition that decides whether player's going or not
    show.update_attributes(:going => true) 
  end
end
于 2013-04-10T00:16:49.497 に答える