2011-09-19 66 views
1

我正在构建一个纸牌游戏(纸牌基本52张纸牌套装* 13等级),并且我决定在这个项目中使用MongoDB。在Mongo集合之间移动文档(通过Mongoid)

我的基本模式是: - >游戏 - >甲板 - >卡 - >播放 - >手(甲板) - >卡 - >决赛(如甲板) - >卡 - >关闭(甲板) - >卡

理想情况下,我想离开游戏的甲板转移卡插入玩家有不同的桩。

但是,执行如下操作:game.players[0].hand.cards.push(game.deck.cards.shift(1))不起作用,相关卡不会从游戏卡组中移除(因为#delete从不会被调用),也不会将其添加到玩家手中(从我了解有限,Mongoid只会增加对象的嵌入式集合)

所以从一个桩移动卡到另一个,我基本上要做到这一点: 游戏= Game.first 玩家=游戏。 players.first

​​

不是地球震撼困难,但我基本上正在做一个READ,一个DESTROY和一个CREATE,来基本上模拟可能是一个非常简单的UPDATE。

有什么我失踪了吗?这是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 
提前

谢谢!

回答

0

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

for ex。

class Parent 
    embeds_one :child 
end 

class Child 
    embedded_in :parent 
end 

对象的孩子= Child.new cant't创建 它可以通过家长只能访问和对lavel创建或销毁。

所以你需要想想如果你想移动实现你想达到的目标。

embedded_in :game 
    embedded_in :player 

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

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

阅读本。

相关问题