Перемещение документа между коллекциями в Mongo (через Mongoid) - PullRequest
1 голос
/ 19 сентября 2011

Я строю карточную игру (базовая колода из 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

Заранее спасибо!

1 Ответ

0 голосов
/ 20 сентября 2011

Вы должны прочитать о разнице между встроенными и ссылочными ассоциациями.

например.

class Parent
  embeds_one :child
end

class Child
  embedded_in :parent
end

Объект child = Child.new не может быть создан Доступ может быть только через Родителя и создан на этом уровне или уничтожен.

Так что вам нужно подумать, чего вы хотите достичь, если хотите двигаться, достичь.

  embedded_in :game
  embedded_in :player

Так что это уже неправильно. На что должен ссылаться (если я правильно понял идею). Вы не можете встроить 1 объект в 2 документа. Это не для встраивания.

http://mongoid.org/docs/relations/embedded.html http://mongoid.org/docs/relations/referenced.html

Прочтите это.

...