我想获取给定 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(使用前将#替换为@)