2011-09-19 59 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

閱讀本。

相關問題