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

2024-07-04

使用 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(使用前将#替换为@)

如何在 Mongoid 中引用嵌入文档? 的相关文章

  • Node.js - 在 Heroku 上使用 MongoHQ 连接到 MongoDB

    我有一个使用 Express 的 Node js 应用程序 它将数据存储在 mongoDB 本地 中 现在它已成功推送到 cedar 堆栈上的 heroku 并且服务器正在运行 我通过终端添加了 mongohq 插件 现在 我如何通过 mo
  • rspec 路由测试和主机

    我发现我可以使用 rspec 测试路由 如下所示 get should route to welcome index 但我有基于主机名或主机名部分的约束以及几个主机名之间的重定向 测试时如何指定主机名 如何使用正确的配置运行测试 我尝试打印
  • 从数组中删除匹配元素的第一个实例

    假设我有数组 1 2 3 1 2 3 我想删除 比如说 的第一个实例2从数组给出 1 3 1 2 3 最简单的方法是什么 li delete at li index n li length li li length 超出范围 所以 li l
  • Ruby on Rails Authlogic 密码无效

    我正在尝试实施 Authlogic 注册没问题 它将所有必要的详细信息输入我的数据库 但是当我尝试登录时 它给了我错误 1 个错误禁止此用户会话 免遭拯救 出现了以下问题 字段 密码无效 我的密码is有效的 我不确定发生了什么 有任何想法吗
  • 在 OSX catalina(10.15.1) 中使用 rbenv 安装 ruby​​-2.4.0 时,构建失败(使用 ruby​​-build 20191124 的 OS X 10.15.1)

    我从在线论坛尝试了很多东西 但从来没有工作过 安装 Xcode 看看是否有效 但事实并非如此 起初 安装 OpenSSL 时 C 可执行文件存在问题 但后来我发现从here https superuser com questions 144
  • put 不会将内容打印到控制台

    我在用着POW http pow cx 促进当地铁路发展 我不知道为什么 但我不能print or puts信息到我的development log 我想将变量的内容从我的控制器放入控制台 日志 有什么建议吗 我读我的日志tail f lo
  • Ruby - 根据数组顺序对哈希值(字符串)数组进行排序

    我有一个如下所示格式的哈希数组 我正在尝试对 book基于单独数组的哈希键 该顺序不是按字母顺序排列的 对于我的用例来说 它不能按字母顺序排列 我需要根据以下数组进行排序 array Matthew Mark Acts 1John 请注意
  • 如何离开阿雷尔?

    Arel 3 0 2 提供了两个类来指定连接类型 Arel Nodes InnerJoin and Arel Nodes OuterJoin和用途InnerJoin作为默认值 foo Arel Table new foo bar Arel
  • 带有 Node.js 的 Ruby 子进程

    我正在尝试启动一个 ruby 实例作为我的节点程序的子进程 事实上 一切都很好 但我只是无法与 ruby 的 STDIN 和 STDOUT 交互 当然 Ruby 程序可以通过键盘输入在我的终端中运行 所以这是我想要工作的简化代码 simpl
  • Rails PostgreSQL 数字字段溢出错误

    我的架构上有一个价格小数字段 每次我尝试插入价格时 pg 都会出现此错误 有人能给我任何启发吗 谢谢 配置 t decimal price precision gt 2 scale gt 2 ERROR PG Error ERROR num
  • 当外来字段是对象数组时的 MongoDB 查找

    我有两个收藏initiatives and resources 倡议文档示例 id ObjectId 5b101caddcab7850a4ba32eb name AI4CSR ressources function ObjectId 5c3
  • Play-Framework 2.4.x 与 MongoDB 和 Java 8 一起使用

    我正在使用创建一个项目Play Framework 2 4 x MongoDB and Java 8 但与Play Framework没有好的 mongo 插件Java Play Framework提到了模块部分中的一些插件 如 Jongo
  • 如何使用 Ruby 的新 lambda 语法?

    Ruby 有 lambda 语法 所以我可以使用 gt symbol a 0 new gt a lt 5 do puts a a 1 end 这非常有效 但是当我尝试这样做时 match to gt e 404 Hello I am mic
  • 。 vs ::(点与双冒号)用于调用方法[重复]

    这个问题在这里已经有答案了 我正在学习 Ruby令人心酸的 Ruby 指南 http www rubyinside com media poignant guide pdf在一些代码示例中 我遇到了双冒号和点的使用 它们似乎用于相同的目的
  • ruby 中 CSV.open( ) 的第二个参数/参数是什么?

    我想我在这里遗漏了一些非常明显的东西 但是每个人为 CSV open 方法输入的第二个参数是什么 在本例中是 wb 我已经看到这里放了其他字母 但没有人真正解释了它的作用 它有什么作用 CSV open path to file csv w
  • HEROKU - 无法运行 git push heroku master [重复]

    这个问题在这里已经有答案了 我运行命令 heroku create stack cedar git push heroku master 但它给了我一个错误 gt Counting objects 144 done Delta compre
  • 强参数允许嵌套属性的所有属性

    有办法进去吗参数强 https github com rails strong parameters允许 a 的所有属性嵌套属性模型 这是示例代码 class Lever lt ActiveRecord Base has one lever
  • 如何在MongoDB聚合中添加自增字段?

    我想添加一个附加的键数字 其中包含自动递增数字的值 我怎样才能实现这个目标 下面是查询 不进行unwind和group是否可以达到这个结果 match iContestId 5e4118161a7b5765ee9b40ef project
  • Mongodb 设计、嵌入与关系

    我正在构建一个简单的会计系统 其中用户有很多账单 现在我试图决定账单是否应该是它自己的集合 或者嵌套在用户中 我倾向于前者 但我从来没有做过任何 noSQL 的东西 所以我只是通过反复试验以及我认为对我有意义的事情 我知道 Mongo 有
  • 确定字符串是否为有效的浮点值

    有没有一种方法可以简单地检查字符串值是否是有效的浮点值 如果字符串不是数值 则对字符串调用 to f 会将其转换为 0 0 当传递一个无效的浮点字符串时 使用 Float 会引发异常 该字符串更接近我想要的 但我不想处理捕获异常 我真正想要

随机推荐

  • 如何用手指在WP7中绘制形状?

    如何用手指在WP7中绘制形状 我正在尝试实现一个简单的绘画应用程序 但我不确定如何进行绘图 有两个示例供您使用 您可以从以下链接下载 示例项目1 http windowsphonegeek com tips drawing in wp7 2
  • 准备 iPhone 的调试器支持

    我无法在 iPhone 上安装该应用程序 我被这条消息困住了 准备 iPhone 的调试器支持 在这里尝试了所有答案 https stackoverflow com questions 46316373 xcode9 iphone is b
  • 连接到主机 localhost 端口 22:连接被拒绝

    在我的本地计算机上安装 hadoop 时 出现以下错误 ssh vvv localhost OpenSSH 5 5p1 OpenSSL 1 0 0e fips 6 Sep 2011 debug1 Reading configuration
  • 如何清除分享链接缓存?

    例如 我尝试分享一个链接http apps facebook com appname http apps facebook com appname 在我的个人资料页面上的 更新状态 下 我修改了应用程序的内容后 它仍然显示缓存 我尝试使用h
  • ((指针)(P)+1)^什么时候可以起作用?

    我正在研究delphiXE2 我正在研究PInteger 如果我在我的delphi代码中这样做 var P PInteger testInt Integer Scores array 0 4 of Integer 33 44 56 78 7
  • 使用 SSE2 优化 RGB565 到 RGB888 的转换

    我正在尝试使用 SSE2 和基本公式来优化从 565 到 888 的像素深度转换 col8 col5 lt lt 3 col5 gt gt 2 col8 col6 lt lt 2 col6 gt gt 4 我采用两个 2x565 128 位
  • 实现 gensim.LdaMallet 时出错

    我按照此链接上的说明进行操作 http radimrehurek com 2014 03 tutorial on mallet in python http radimrehurek com 2014 03 tutorial on mall
  • OpenCV 中二值图像的 width 和 widthStep 不同

    我使用 cvLoadImage 在 OpenCV 中加载二进制图像 如下所示 IplImage myImg cvLoadImage
  • Windows 上的 Xvfb

    我正在使用 pyvirtualdisplay 使用无头 Firefox 浏览器运行测试 这是我正在使用的代码 from selenium import webdriver from selenium webdriver support ui
  • VB6 的线程模型是什么?

    我正在将一个古老的 VB6 程序移植到 C Net 我不太了解VB6 我问这个是为了更好地理解它 旧的VB6程序有一个程序执行的主过程 但是它also有许多用于套接字事件或计时器事件的事件处理程序 以及这些经常操纵的共享资源 例如 公共全局
  • 如何在CSS中搜索某些内容时隐藏搜索图标

    我想隐藏search当用户搜索某些内容时的图标 连我都想躲起来 保留图标和清除图标x就这样 问题如下图所示 NOTE 我想保持相同的差距search icon and Search text input type search width
  • React:将组件存储在对象中

    我的用户配置文件中有几十个字段 我正在尝试构建一种有效的方法来在适当的输入表单组件中显示它们 例如 配置文件可能如下所示 profile1 name Cornelius Talmadge phone 1 如果我可以像这样堆叠组件 expor
  • 处理本地存储库中的旧快照的最佳方法?

    我们有一个 Nexus 本地存储库管理器 用于处理我们所有的内部项目 以及外部存储库的镜像 对于我们的内部项目 我们只保留最新版本的快照构建 例如 如果我们有 ProjectX 1 0 1 1 和 1 2 SNAPSHOT 那么一旦 1 2
  • 如何使用 OpenID Connect WebFinger 端点?

    正在阅读描述在这里 https connect2id com learn openid connect optional endpoints它说 WebFinger 允许根据给定用户的电子邮件地址或其他一些信息动态发现 OpenID Con
  • 在 Fortran 中分配字符数组

    我必须编写一个可以由 C 和 Fortran 调用的子例程 该子例程将文件名作为其参数之一 我知道为了与 C 良好地互操作 ISO C 绑定建议使用字符数组进行互操作 我的问题是 是否存在易于编写的字符数组文字之类的东西 我有一个这样的子程
  • 使用 Powershell 脚本开始调试 Visual Studio 项目

    我曾经在 Visual Studio 中打开解决方案文件 右键单击项目 选择 调试 gt 启动新实例 来启动调试会话 我可以编写一个 powershell 脚本来自动执行此操作吗 为了让事情变得更简单 自动化不必重建和项目 脚本只需要在 V
  • Grails:未刷新的会话和回滚的事务之间有什么区别?

    我对会话和交易感到非常困惑 我基本上不明白两者都有什么意义 而且我很困惑何时使用其中之一 未刷新的会话和未提交的事务有什么区别 我什至不知道如何询问我不知道的事情 是否有资源可以提供常见会话和事务情况的良好示例 以便我可以看到差异 一般来说
  • Docker 容器中 GUI 应用程序的 X11 转发

    我目前正在尝试在 docker 容器中运行一些 GUI 应用程序 我一直在尝试那些杰西 弗雷泽尔 https github com jessfraz at github https github com jessfraz dockerfil
  • 通过 ref 传递的引用类型和不通过 ref 传递的引用类型

    以不同方式调用 4 种方法时得到不同的结果 static void Main string args var emp new Employee Name ABC ChangeName1 emp Console WriteLine emp N
  • 如何在 Mongoid 中引用嵌入文档?

    使用 Mongoid 假设我有以下类 class Map include Mongoid Document embeds many locations end class Location include Mongoid Document