Я строю карточную игру (базовая колода из 52 карт игральных карт 4 масти * 13 рангов), и я выбрал MongoDB для этого проекта.
Моя базовая модель: ->Игра -> Колода -> Карты -> Игроки -> Рука (как колода) -> Карты -> Финал (как колода) -> Карты -> Закрытие (как колода) -> Карты
В идеале я хотел бы переложить карты из колоды игры в различные стопки, которые есть у игроков.
Однако сделать что-то вроде: game.players[0].hand.cards.push(game.deck.cards.shift(1))
не работает, рассматриваемая карта нене удален из колоды игры (потому что никогда не вызывается #delete) и не добавляется в руку игрока (из моего ограниченного понимания Mongoid будет добавлять только новые объекты во встроенную коллекцию).
Таким образом, чтобы переместить карту из одной колоды в другую, я в основном должен сделать это: game = Game.first player = game.players.first
card = game.deck.cards.shift
copy = Card.new(card.card_id) #read,create
player.hand.cards << copy
if player.save!
card.delete #delete
game.save
end
Не так уж сложно, земля,но я в основном делаю READ, DESTROY и CREATE, чтобы подражать тому, что может быть очень простым ОБНОВЛЕНИЕМ.
Есть ли что-то, чего мне не хватает?Это ограничение Mongoid ODM?Является ли перемещение документов между коллекциями огромным нет-нет?
Я очень открыт для предложений по модели, так как не знаю, подходят ли встроенные документы даже для такой проблемы.
Ниже приведена соответствующая табличка котла
class Deck
include Mongoid::Document
field :is_deck, :type => Boolean
embedded_in :game
embedded_in :player
embeds_many :cards
end
class Card
include PlayingCards
include Mongoid::Document
embedded_in :deck
field :card_id, :type => Integer
field :idx, :type => Integer #used to maintain shuffled order since mongodb is insertion order
field :rank, :type => String
field :suit, :type => String
end
class Game
include Mongoid::Document
embeds_one :deck #deck players draw from
embeds_many :players
field :current_player, type: Integer
field :num_players, type: Integer
end
class Player
include Mongoid::Document
embedded_in :game
embeds_one :hand, class_name: "Deck"
embeds_one :closing, class_name: "Deck"
embeds_one :final, class_name: "Deck"
end
Заранее спасибо!