在Mongo中通过集合移动​​文档(通过Mongoid)

时间:2011-09-19 18:28:13

标签: mongodb mongoid padrino

我正在建立一个纸牌游戏(基本的52张扑克牌4套牌* 13等级),我决定使用MongoDB进行这个项目。

我的基本模型是: - >游戏      - >甲板          - >牌      - >玩家          - >手(如甲板)              - >牌          - >决赛(如甲板)              - >牌          - >关闭(如甲板)              - >卡

理想情况下,我希望将牌从牌组中转移到玩家所拥有的各种牌中。

然而,执行以下操作:game.players[0].hand.cards.push(game.deck.cards.shift(1))不起作用,相关的卡片不会从游戏的牌组中删除(因为#delete永远不会被调用),并且它不会添加到玩家手中(根据我的有限理解,Mongoid只会将 new 对象添加到嵌入式集合中。)

因此,要将卡从一堆移到另一堆,我基本上必须这样做: 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 :(得分:0)

您应该阅读嵌入和引用关联之间的区别。

代表

class Parent
  embeds_one :child
end

class Child
  embedded_in :parent
end

对象child = Child.new无法创建 它只能通过Parent访问并在该lavel上创建或销毁。

因此,如果你想要实现目标,你需要思考你想要实现的目标。

  embedded_in :game
  embedded_in :player

所以这已经错了。这应该引用(如果我正确理解的想法)。你不能在2个文件中嵌入1个对象。这不适用于嵌入式用于。

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

阅读本文。