我正在建立一个纸牌游戏(基本的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
提前致谢!
答案 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
阅读本文。