gpt4 book ai didi

ruby - 如何在 Mongoid 中引用嵌入的文档?

转载 作者:IT老高 更新时间:2023-10-28 13:04:42 25 4
gpt4 key购买 nike

使用 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

如您所见,我正在尝试为一个简单的游戏世界环境建模,其中 map 嵌入了位置,玩家将单个位置引用为他们的当前位置。

使用这种方法,当我尝试引用 Player 类的“位置”属性时出现以下错误:

Mongoid::Errors::DocumentNotFound: Document not found for class Location with id(s) xxxxxxxxxxxxxxxxxxx.

我的理解是,这是因为 Location 文档是嵌入的,因此很难在其嵌入文档( map )的范围之外进行引用。这是有道理的,但是如何对嵌入文档的直接引用进行建模呢?

最佳答案

因为 map 是它们自己的集合,您需要遍历每个 map 集合,在其中搜索您的播放器被引用的位置。

您不能直接访问嵌入的文档。您必须通过收藏进入并向下工作。

为避免迭代所有 map ,您可以在 Player 文档中存储位置引用和 map 引用。这允许您链接选择您的 map 的标准,然后选择其中的位置。你必须在你的 Player 类上编写一个方法来处理这个。

def location
self.map.locations.find(self.location_id)
end

因此,类似于您自己回答的方式,只是您仍然可以将 location_id 存储在播放器文档中,而不是使用坐标属性。

另一种方法是将 map 、位置和玩家放在他们自己的集合中,而不是将位置嵌入到您的 map 集合中。然后你可以使用引用关系而不做任何花哨的事情......但是你真的只是使用分层数据库就像它是一个关系数据库......

关于ruby - 如何在 Mongoid 中引用嵌入的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3890633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com