2013-08-25 2 views
0

Прямо подлежит обсуждению: у меня есть модели Game, Board и Player в моем приложении.Как ограничить количество ассоциаций в Rails

Game -> Board <- Player 

Игра для игроков - это много-много отношений через доски. Я бы хотел ограничить, что в игре может быть только 2 доски (поэтому только два игрока).

game = Game.create 

game.players.push Player.create 
game.players.push Player.create 
game.players.push Player.create #this line should throw some exception 

Я ничего не вижу из коробки, которую я мог бы использовать. Одна из идей - использовать проверки, но это единственный способ?

ответ

3

Предполагая, что вы используете ActiveRecord или что-нибудь еще с помощью ActiveSupport, можно добавить пользовательскую проверку на борту:

class Board 
    validate :player_count_validation 

    has_many :players 

    private 

    def player_count_validation 
    if players.length > 2 
     errors.add(:players, "must have length at most two") 
    end 
    end 
end 

Тогда он будет работать так:

board = Board.new 
board.players << Player.create! 
board.players << Player.create! 
board.players << Player.create! # No exception here 
board.save # returns false 
board.save! # Raises validation exception 
board.errors # Something like { players: ["must have length at most two"] } 
board.errors.full_messages # ["Players must have length at most two"] 
0

Кроме валидаций, вы также можете использовать специальный метод для добавления дочерних объектов:

def add_player(player) 
    if players.count < 2 
    self.players << player 
    else 
    raise 'Too many players' 
    end 
end 

Это делает соблюдение лимита при добавлении игроков, используя этот метод, но не тогда, когда доступ непосредственно через ассоциацию, например, obj.players << player.

Смежные вопросы