Я в одной лодке: новичок в Rails и создание шахматного приложения.Я начал использовать отношения has_and_belongs_to_many между игроками и играми, но я не мог понять, как правильно смоделировать роли белых и черных игроков таким образом.Мне нужен был способ проследить отношения между игроком и играми.
Сначала я добавил третью модель под названием «Места», а затем настроил свои модели игрока и игры, чтобы иметь отношение has_many: through, например:
class Game < ActiveRecord::Base
has_many :seats
has_many :players, :through => :seats
end
class Player < ActiveRecord::Base
has_many :seats
has_many :games, :through => :seats
end
class Seat < ActiveRecord::Base
belongs_to :game
belongs_to :player
end
Это настраивает модель так, чтобы работали game.players и player.games.
Чтобы отследить белого и черного игрока, я добавил колонку для цвета в таблице мест:
create_table "seats", :force => true do |t|
t.integer "player_id"
t.integer "game_id"
t.integer "color"
t.datetime "created_at", :null => false
end
Затем в игровой модели я добавил несколько вспомогательных методов, чтобы я мог получить белого игрока с помощью game.white_player и установить с помощью game.white_player = foo
class Game < ActiveRecord::Base
...
def white_player
Player.joins(:games).where(:seats => {:color => 0, :game_id => self.id}).first
end
def white_player=(player)
self.players << player
s = self.seats.find_by_player_id(player)
s.color = 0
s.save
end
Я не уверен, что этонаилучший подход, но, похоже, он отвечает моим требованиям:
game.players # returns game's players
player.games # returns player's games
game.white_player # returns the white player
game.white_player = player # sets the white player
Мне было бы интересно узнать, как можно улучшить это.