使用 Mongoid,假设我有以下类:
class Map
include Mongoid::Document
embeds_many :locations
end
class Location
include Mongoid::Document
field :x_coord, :type => Integer
field :y_coord, :type => Integer
embedded_in :map, :inverse_of => :locations
end
class Player
include Mongoid::Document
references_one :location
end
正如您所看到的,我正在尝试对一个简单的游戏世界环境进行建模,其中地图嵌入位置,并且玩家引用单个位置作为当前位置。
使用这种方法,当我尝试引用 Player 类的“location”属性时,出现以下错误:
Mongoid::Errors::DocumentNotFound: Document not found for class Location with id(s) xxxxxxxxxxxxxxxxxxx.
我的理解是,这是因为位置文档是嵌入的,因此很难在其嵌入文档(地图)的范围之外进行引用。这是有道理的,但如何对嵌入文档的直接引用进行建模?
因为地图是它们自己的集合,所以您需要迭代每个地图集合,在其中搜索您的玩家所引用的位置。
您无法直接访问嵌入的文档。您必须进入该集合并一路向下。
为了避免迭代所有地图,您可以将位置引用和地图引用都存储在播放器文档中。这允许您链接选择地图的标准,然后选择其中的位置。您必须在 Player 类上编写一个方法来处理此问题。
def location
self.map.locations.find(self.location_id)
end
因此,与您自己的回答类似,只是您仍然可以将 location_id 存储在播放器文档中,而不是使用坐标属性。
另一种方法是将地图、位置和玩家放入它们自己的集合中,而不是将位置嵌入到地图集合中。然后您可以使用引用关系而不做任何花哨的事情...但是您实际上只是使用分层数据库,就像此时它是一个关系数据库...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)