按指定顺序按 id 查找 ActiveRecord 对象的简洁方法

2023-11-21

我想获取给定 id 数组的 ActiveRecord 对象数组。

我假设

Object.find([5,2,3])

将返回一个依次包含对象 5、对象 2、对象 3 的数组,但我得到的数组按对象 2、对象 3、对象 5 的顺序排列。

ActiveRecord 基础查找方法API提到您不应该期望它按照提供的顺序出现(其他文档没有给出此警告)。

中给出了一种可能的解决方案按相同顺序的 ids 数组查找?,但 order 选项似乎对 SQLite 无效。

我可以编写一些 ruby​​ 代码来自己对对象进行排序(要么有点简单但缩放效果较差,要么缩放效果更好但更复杂),但是有更好的方法吗?


MySQL 和其他数据库并不是自己对事物进行排序,而是它们不对其进行排序。你打电话时Model.find([5, 2, 3]),生成的 SQL 类似于:

SELECT * FROM models WHERE models.id IN (5, 2, 3)

这不指定顺序,只指定您想要返回的记录集。事实证明,一般MySQL会返回数据库行'id'订单,但无法保证这一点。

让数据库按保证顺序返回记录的唯一方法是添加 order 子句。如果您的记录始终以特定顺序返回,那么您可以向数据库添加一个排序列并执行Model.find([5, 2, 3], :order => 'sort_column')。如果不是这种情况,则必须在代码中进行排序:

ids = [5, 2, 3]
records = Model.find(ids)
sorted_records = ids.collect {|id| records.detect {|x| x.id == id}} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按指定顺序按 id 查找 ActiveRecord 对象的简洁方法 的相关文章

随机推荐

  • 在 Visual Studio 2008 中使用自定义安装程序时出现错误 1001

    我创建了一个简单的 winforms 应用程序和一个自定义安装程序 这一切看起来很简单 但我在事件日志中收到以下弹出窗口和错误详细信息 来自源 MsiInstaller 的事件 ID 11001 的描述无法 成立 引发此事件的组件未安装在
  • kafka.consumer.SimpleConsumer:由于套接字错误而重新连接:java.nio.channels.ClosedChannelException

    我正在为 kafka 运行一个简单的消费者 如下所示 int timeout 80000 int bufferSize 64 1024 consumer new SimpleConsumer host port timeout buffer
  • 如何序列化异步/等待?

    假设我有这个简单的片段 async void button Click object sender RoutedEventArgs e await Task Factory StartNew gt Console WriteLine sta
  • 与 Python 的代理连接

    我一直在尝试从 python 连接到 URL 我努力了 urllib2 urlib3 和请求 我在所有情况下都遇到同样的问题 一旦我得到答案 我想他们三个都会工作得很好 问题是通过代理连接 我已经输入了我们的代理信息 但没有得到任何快乐 我
  • 如何在 PHP 中对具有依赖关系的方法进行单元测试?

    我有一个带有一些逻辑的方法 但我不确定如何对其进行单元测试 因为它是针对此特定方法的单元测试 所以它应该在不连接到数据库的情况下运行 我读过有关存根和模型的内容 但我找不到将它们应用于这种情况的方法 我想强制 Client GetClien
  • kaminari 未定义方法 `total_pages'

    在使用 kaminari 时 我遇到了错误 Gemfile gem will paginate gt 3 0 6 gem will paginate bootstrap gem kaminari 列表控制器 rb def index if
  • 在变量声明中使用冒号[重复]

    这个问题在这里已经有答案了 最近有人问我这在 Python 中意味着什么 gt gt gt char str 我不知道 我检查了文档 没有类似的内容 一个建议是它是静态类型声明 但文档中也完全没有关于这一点的内容 有了上面的内容 如果我 g
  • 动态加载部分视图

    对于一个项目 我需要一种加载部分视图的动态方式 最好是通过 jquery ajax 这是我需要的功能 用户输入表单 将显示一个下拉列表 并使用一些输入控件呈现通用部分视图 用户在下拉列表中选择不同的值 局部视图刷新 根据下拉列表的值 它应该
  • 的内容在哪里' aria-label='getChildHtml('right') ?> 的内容在哪里'> getChildHtml('right') ?> 的内容在哪里

    我正在尝试重新组织我的右侧边栏 在模板 右2列 中 它调用 我在哪里可以找到这个变量的内容 对方法的调用getChildHtml 使用传递给方法的名称加载子块的 HTML 因此在本例中我们正在寻找名为的子块right 为了确定在哪里找到这个
  • asp.net“已达到网络 BIOS 命令限制”ASP.NET 2.0 + 3.5

    我正在尝试在 ASP NET 2 0 3 5 中运行 tinyMCE 文本编辑器 但我的 web config 文件中出现以下错误 加载配置文件时发生错误 无法开始监视对 Visual Studio 2005 WebSites TinyMC
  • 如何将 NSRect 更改为 CGRect?

    void drawRect NSRect rect imgRect orgin NSZeroPoint imgRect size appleImage size drawRect self bounds appleRect drawInRe
  • Fragment.onCreateView 具有空容器

    以下代码在 Android 1 6 上运行 因此我使用片段的兼容性包 在下面的TestFragment是一个静态嵌套类 public class FragmentTestActivity extends FragmentActivity O
  • 补丁请求 Android Volley

    我目前正在一个项目中使用 Android 的 Volley 网络库 我已经从以下位置拉下了凌空的主分支https android googlesource com platform frameworks volley 所以我的库项目应该是最
  • R .libPaths() RStudio 和命令行 R 之间的区别

    当我从命令行运行 R 时 gt library ggplot2 gt path package ggplot2 1 home yang R x86 64 pc linux gnu library 2 13 ggplot2 gt libPat
  • 为 iOS(iPhone 和 iPad)制作两个故事板

    是否可以只制作一个应用程序 并在其中制作两个故事板 一个用于 iPhone 一个用于 iPad 我不喜欢在 iPad 上运行应用程序并单击 2x 按钮的想法 我的想法是创建两个故事板 并有一个入门课程 该课程将检查您使用的设备是 iPhon
  • 如何使用 Python 和 Gracenote 识别音乐样本?

    我最近发现了GNSDK Gracenote SDK 似乎提供了多种编程语言的示例 通过指纹识别音乐样本 然后请求其音频数据库获取相应的艺术家和歌曲标题 但文档太糟糕了 如何使用 Python 和 GNSDK 执行音频样本文件的识别 提供的文
  • SBT 0.10 和 IDEA 初学者指南

    我是 SBT 新手 不确定如何开始项目 有人可以向我指出创建 Hello World 类型项目的初学者指南 或者给我一些线索吗 我首选的 IDE 是 IDEA 我跑了sbt idea根据说明IDEA 插件页面 目前我有点困惑 因为 没有创建
  • 从 Rails 返回文件

    初学者铁路问题 如何从 Rails 中的控制器返回文件 我熟悉返回 渲染 JSON 对象 但是我从未返回 渲染带有任意扩展名的文件 从阅读周围所以听起来像render nothing gt true有帮助 我只是在寻找一些指导或相关文档 您
  • 如何使用 dplyr 编程语法来创建和计算变量名称

    我想使用 dplyr 编程语法动态输入变量名 但是 正如许多人所描述的那样 这可能非常令人困惑 我尝试过各种 quo enquo 的组合 等等都无济于事 这是我的代码的最简单形式 library tidyverse df lt tibble
  • 按指定顺序按 id 查找 ActiveRecord 对象的简洁方法

    我想获取给定 id 数组的 ActiveRecord 对象数组 我假设 Object find 5 2 3 将返回一个依次包含对象 5 对象 2 对象 3 的数组 但我得到的数组按对象 2 对象 3 对象 5 的顺序排列 ActiveRec