Trouble with many_to_many association

Hello!

I’m working on a chess-like ranking site where a player can add a game played between him and an opponent and then select the winner of the game.

My first setup was to use two tables (users and games). The player would then select himself, an opponent and the winner and the options were saved to the games table as player_id, opponent_id and winner_id. Everything was working fine until I wanted to list all the games and display the usernames of the players.

What I think I should be doing is a many_to_many relation, a game has many players and a player has many games. Now I’ve pretty much hit a wall. So far I have:

schema "users" do
  field :username, :string
  many_to_many :games, App.League.Game, join_through: "users_games"
  timestamps()
end

def changeset(%User{} = user, attrs) do
  user
  |> cast(attrs, [:username])
  |> validate_required([:username])
end

schema "games" do
  field :winner_id, :integer
  many_to_many :users, App.Accounts.User, join_through: "users_games"
  timestamps()
end

def changeset(%Game{} = game, attrs) do
  game
  |> cast(attrs, [:winner_id])
  |> validate_required([:winner_id])
end

How do I get the add game form to list all the users and when added the game_users table will be updated with the user_id?
Is anyone willing to chime with some pointers or code on how I continue from here?

Maybe this helps?

Or this?

A chess game has one white player, and one black player… not really many players.

A player has many white/black games.

I think it is easier to model it like this.

BTW a chess game can eventually ends in a draw, that would be… no winner. It is better to store the result of the game… 1-0, 0-1, 1/2-1/2.

1 Like