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

标签 ruby-on-rails sqlite activerecord find rails-activerecord

我想在给定一组 id 的情况下获得一组 ActiveRecord 对象。

我以为

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

将返回一个数组,依次为对象 5、对象 2、对象 3,但我得到的数组顺序为对象 2、对象 3,然后是对象 5。

ActiveRecord 库 find method API提到您不应该按照提供的顺序期望它(其他文档没有给出此警告)。

Find by array of ids in the same order? 中给出了一个潜在的解决方案,但顺序选项似乎对 SQLite 无效。

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

最佳答案

并不是说 MySQL 和其他 DB 会自行排序,而是它们不会对它们进行排序。当您调用 Model.find([5, 2, 3]) 时,生成的 SQL 类似于:

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

这没有指定顺序,只是您要返回的记录集。事实证明,通常 MySQL 会以 'id' 顺序返回数据库行,但并不能保证这一点。

让数据库以保证顺序返回记录的唯一方法是添加一个顺序子句。如果您的记录将始终以特定顺序返回,那么您可以向数据库添加一个排序列并执行 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}} 

关于ruby-on-rails - 按指定顺序按 id 查找 ActiveRecord 对象的简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/801824/

相关文章:

ruby-on-rails - 在 Heroku 上从 SQLite3 迁移到 Mongodb?

mysql - Rails连接Mysql时的"Access Denied"

php - 如果出现多行,如何在 php mysql 的侧存储过程中执行选择查询?

c# - NLOG,在 Windows Phone 8 上登录 SQLite

ruby-on-rails - 如何组合来自多个 has_many :through queries? 的 ActiveRecord 结果

ruby-on-rails - 基于更改的属性值查询 Rails 模型

ruby-on-rails - 如何在 Rails 中测试非 ActiveRecord 模型?

ruby-on-rails - 为什么我的 Ubuntu 服务器无法安装 Rails 2.3.8?

android - 仅在首次创建数据库时将记录插入 sqlite 数据库

php - Yii2删除ActiveRecord错误消息有时是数组,有时不是吗?