我有一个ID数组,存储在一些外部存储(rails缓存或redis)中。在控制器的动作我使用它,即ActiveRecord order by external array
ids = [5, 1, 17, 84] # really fetched from external source
result = MyModel.where(:id => ids)
获取这个数据,然后选择对象我也希望它可以给你开的相同array_of IDS入侵检测系统:
ids == result.map(&:id) # => true
至于解决方法我用排序MySQL的场函数:
MyModel.where(:id => ids).order("FIELD(id, #{ids.join ', '})")
但因为它是MySQL的具体和大ids
阵列的情况下产生很长的查询,我不喜欢这种方式。 有没有更好的,DB不可知的方式来做到这一点?从数据库中提取未分类的数据并在红宝石一侧进行排序是不理想的,因为它资源昂贵且难以用于分页。
谢谢。
的可能的复制[ActiveRecord.find(阵列\ _of \ _ids),维持秩序(https://开头计算器。 com/questions/1680627/activerecord-findarray-of-id-preserving-order) – MatayoshiMariano 2017-08-11 19:32:52