2011-09-19 4 views
1

Je construis un jeu de cartes (base de 52 cartes de cartes à jouer 4 combinaisons * 13 rangs), et j'ai choisi MongoDB pour ce projet.Déplacer un document entre des collections dans Mongo (via Mongoid)

Mon modèle de base est: -> Jeu -> Pont -> Cartes -> Joueurs -> main (comme plate-forme) -> Cartes -> Finale (comme plate-forme) -> cartes -> Fermeture (comme plate-forme) -> cartes

Idéalement je voudrais changer les cartes de la plate-forme du jeu dans les différentes piles que les joueurs ont. Cependant, faire quelque chose comme: game.players[0].hand.cards.push(game.deck.cards.shift(1)) ne fonctionne pas, la carte en question n'est pas retirée du deck du jeu (parce que #delete n'est jamais appelée), et elle n'est pas ajoutée à la main du joueur (de mon compréhension limitée, MongoId ajoutera seulement nouveaux objets à une collection embarquée)

donc, pour déplacer une carte d'une pile à l'autre, je dois essentiellement le faire. jeu = Game.first joueur = jeu. 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 

Non terriblement difficile, mais je fais essentiellement un READ, un DESTROY et un CREATE, pour essentiellement émuler ce qui pourrait être une mise à jour très simple.

Y a-t-il quelque chose qui me manque? Est-ce une limitation de l'ODM de Mongoid? Le déplacement de documents entre les collections est-il un non-non?

Je suis très ouvert aux suggestions sur le modèle, car je ne sais pas si les documents intégrés sont même un bon ajustement pour ce type de problème.

Ci-dessous la plaque de la chaudière correspondante

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 

Merci à l'avance!

Répondre

0

Vous devriez lire à propos de la différence entre les associations incorporées et référencées.

par ex.

class Parent 
    embeds_one :child 
end 

class Child 
    embedded_in :parent 
end 

enfant Object = Child.new cant't créé Il peut être accès uniquement par des parents et créé sur ce lavel ou détruire.

Alors vous devez penser à ce que vous voulez accomplir si vous voulez vous déplacer.

embedded_in :game 
    embedded_in :player 

Donc, ce déjà faux. Cela devrait être référencé par (si j'ai correctement compris l'idée). Vous ne pouvez pas incorporer 1 objet dans 2 documents. Ce n'est pas pour embarqué est utilisé pour.

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

lire.

Questions connexes