2011-09-19 3 views
1

나는 카드 게임 (카드 4 장의 슈트 * 13 랭크의 기본 52 카드 데크)을 만들고이 프로젝트를 위해 MongoDB를 결정했습니다.Mongo의 콜렉션 사이에서 문서 이동하기 (몽고이드를 통해)

내 기본 모델은 다음과 같습니다 -> 게임 -> 데크 -> 카드 -> 선수 - (데크 등)> 핸드 -> 카드 -> 최종 (로 갑판) -> 카드 -> () 갑판으로 닫기 -> 카드

가 이상적으로는 플레이어가 가지고있는 여러 더미로 게임의 갑판 떨어져 카드를 이동하고 싶습니다.

그러나, game.players[0].hand.cards.push(game.deck.cards.shift(1))과 같은 작업을 수행하지 않으면 문제의 카드가 게임의 덱에서 제거되지 않으며 (#delete는 호출되지 않기 때문에), 플레이어의 손에 추가되지 않습니다. 제한된 이해 Mongoid 만 포함 된 컬렉션에 새로운 개체를 추가합니다)

그래서 다른 하나 개 더미에서 카드를 이동, 나는 기본적으로이 작업을 수행 할 수 있습니다. 게임 = Game.first 플레이어 = 게임. 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 

아니요 지구 shatteringly 어려운,하지만 난 기본적으로 읽기, 파괴와 창조, 기본적으로 아주 간단한 업데이 트가 될 수있는 에뮬레이트하는거야.

내가 누락 된 자료가 있습니까? 이것이 몽고 이드 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

포함 된 연결과 참조 된 연결의 차이점을 읽어야합니다.

예 :

class Parent 
    embeds_one :child 
end 

class Child 
    embedded_in :parent 
end 

개체 아이 = Child.new 그것은 부모를 통해서만 접근하고 그 LAVEL에 만들거나 파괴 할 수 을 만들 수 cant't.

달성하기를 원한다면 달성하고 싶은 것을 생각해야합니다.

이렇게 잘못되었습니다. 그것은 (내가 정확하게 생각을 이해한다면)에 의해 참조되어야합니다. 당신은 2 문서에 1 개체를 포함 할 수 없습니다. 이것은 임베디드가 아닌 사용됩니다.

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

이 읽기.