我正在使用Mongoid,但我遇到了这个问题,我正在尝试使用Mongoid。
我有一个游戏,游戏有团队,团队有玩家,游戏有相同的玩家。
class Game
include Mongoid::Document
embeds_many :Players
embeds_many :Teams
end
class Team
include Mongoid::Document
embedded_in :Game
embeds_many :Players
end
class Player
include Mongoid::Document
embedded_in :Game
embedded_in :Team
end
现在我使用
运行此代码game = Game.new( :id => "1" )
game.save
player = Player.new()
game.Players << player
team = Team.new()
game.Teams << team
team.Players << player
我希望有一个游戏,有一个团队,该团队有一个玩家,而且该玩家也在游戏中。
然后我跑
newgame = Game.find("1")
newteam = newgame.Teams.first
newplayer = newgame.Players.first
newplayer2 = newteam.Players.first
newplayer存在,newplayer2不存在。
那是怎么回事?
我是否只允许在一个对象中嵌入文档,是否有办法绕过它?我尝试将其中一个关系设为belongs_to,如果根据输出嵌入文档,则不允许这样做。
我知道我可以改变模型(游戏不需要链接到玩家)我只是想知道这种关系是否违反某些规则,或者是否有一些技巧可以使这项工作如上所述。
作为一个附带问题,有人可以在这种情况下遵守“保存”规则(或者假设玩家没有嵌入团队中)。一旦我设置了这个,我似乎不必保存游戏,团队和播放器来记录嵌入。如果我保存其中任何一个,则自动保存。或者在设置关系后修改它们时我是否必须保存每个单独的文档(假设在建立关系后完成修改)。
答案 0 :(得分:1)
您不想使用embeds_many
。这个&#34;嵌入&#34;将文档放入父文档中,然后将其嵌入多个父文档中是没有意义的,因为那时您的Player
数据将在多个位置重复。
想想当数据存储在多个位置时,不断更新和保持数据一致性的噩梦。
您想要使用has_many
来建模这些关系。这仅存储父文档中的_id
文档,而实际文档存储在单独的集合中,并允许多个父项引用它。
http://mongoid.org/en/mongoid/docs/relations.html#has_many
使用Mongoid的has_many和belongs_to宏定义一对多关系,其中子项存储在与父文档不同的集合中。
class Game
include Mongoid::Document
has_many :Players
has_many :Teams
end
class Team
include Mongoid::Document
belongs_to :Game
has_many :Players
end
class Player
include Mongoid::Document
belongs_to :Game
belongs_to :Team
end