나는 카드 게임 (카드 4 장의 슈트 * 13 랭크의 기본 52 카드 데크)을 만들고이 프로젝트를 위해 MongoDB를 결정했습니다.Mongo의 콜렉션 사이에서 문서 이동하기 (몽고이드를 통해)
내 기본 모델은 다음과 같습니다 -> 게임 -> 데크 -> 카드 -> 선수 - (데크 등)> 핸드 -> 카드 -> 최종 (로 갑판) -> 카드 -> () 갑판으로 닫기 -> 카드
가 이상적으로는 플레이어가 가지고있는 여러 더미로 게임의 갑판 떨어져 카드를 이동하고 싶습니다.그러나, game.players[0].hand.cards.push(game.deck.cards.shift(1))
과 같은 작업을 수행하지 않으면 문제의 카드가 게임의 덱에서 제거되지 않으며 (#delete는 호출되지 않기 때문에), 플레이어의 손에 추가되지 않습니다. 제한된 이해 Mongoid 만 포함 된 컬렉션에 새로운 개체를 추가합니다)
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
사전에
감사에게있다!