我想在给定一组 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/