我有一系列的ID
a1 = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
我有另一个对象数组,其中id为随机顺序
a2 = [(obj_with_id_5), (obj_with_id_2), (obj_with_id_1), (obj_with_id_3), (obj_with_id_4)]
Run Code Online (Sandbox Code Playgroud)
现在我需要根据a1中id的顺序对a2进行排序.所以a2现在应该成为:
[(obj_with_id_1), (id_2), (id_3), (id_4), (id_5)]
Run Code Online (Sandbox Code Playgroud)
a1可能是[3,2,5,4,1]或任何顺序,但a2应对应于a1中id的顺序.
我喜欢这个:
a1.each_with_index do |id, idx|
found_idx = a1.find_index { |c| c.id == id }
replace_elem = a2[found_idx]
a2[found_idx] = a2[idx]
a2[idx] = replace_elem
end
Run Code Online (Sandbox Code Playgroud)
但是如果a2的元素顺序正好与a1相反,那么这仍然可能会遇到O(n ^ 2)时间.有人可以告诉我最有效的排序方式吗?
我想获得一个给定一组id的ActiveRecord对象数组.
我认为
Object.find([5,2,3])
Run Code Online (Sandbox Code Playgroud)
将返回一个数组,其中包含对象5,对象2,然后按顺序返回对象3,但我得到的数组按对象2,对象3和对象5排序.
ActiveRecord Base 查找方法API提到您不应该按照提供的顺序期望它(其他文档不提供此警告).
一个可能的解决方案是按相同顺序的ID数组查找的?,但订单选项似乎对SQLite无效.
我可以编写一些ruby代码来自己对对象进行排序(有点简单,缩放比例较差或缩放比较复杂),但是有更好的方法吗?
我正在考虑解决问题的最佳方案.假设我们有一个ActiveRecord模型的ID列表:
ids = [1, 100, 5, 30, 4, 2, 88, 44]
Run Code Online (Sandbox Code Playgroud)
然后我想进行查询,选择所有用户,例如列表中的ID,但保持订单.如果我做
User.where(id: ids)
Run Code Online (Sandbox Code Playgroud)
响应将是具有asc order by id的用户列表,但我希望订单与数组中的顺序相同.
您认为这是最好的解决方案吗?选择所有用户,然后操作ActiveRecord对象列表?也许有一种更聪明的方法可以做到这一点.
谢谢!
我有一组id,存储在一些外部存储(rails cache或redis)中.在控制器的操作中,我获取此数据并使用它选择对象,即
ids = [5, 1, 17, 84] # really fetched from external source
result = MyModel.where(:id => ids)
Run Code Online (Sandbox Code Playgroud)
我也希望它的顺序与array_of id中的id相同:
ids == result.map(&:id) # => true
Run Code Online (Sandbox Code Playgroud)
作为解决方法,我使用mysql FIELD函数排序:
MyModel.where(:id => ids).order("FIELD(id, #{ids.join ', '})")
Run Code Online (Sandbox Code Playgroud)
但我不喜欢这种方法,因为它是特定于mysql的,并且在大ids数组的情况下创建非常长的查询.有没有更好的,与DB无关的方法呢?从数据库获取未分类的数据并在ruby端进行排序是不可取的,因为它资源昂贵并且难以与分页一起使用.
谢谢.
知道默认情况下 Rails 按 ID 对数据进行排序,那么如何按给定 where 子句的 id 进行排序呢?
ids = Bookmark.where(user_id: 7).order(created_at: :desc).pluck(:company_id)
Run Code Online (Sandbox Code Playgroud)
结果:
[146, 140, 128, 4, 2]
现在,当我尝试以相同的顺序获取这些公司时ids
Company.where(id: ids).pluck(:id)
Run Code Online (Sandbox Code Playgroud)
结果:
[2、4、128、140、146]
预期结果:
[146, 140, 128, 4, 2]
我假装的结果在两种情况下都是相同的(相同的顺序)。返回公司的顺序应与创建该公司的书签的顺序相同。
我有 ids 数组ids = [5,2,1,6]。
我想找到具有这些 id 的所有记录并保持与ids数组中相同的顺序。
常规records = Product.find(ids)不保留此顺序(不确定,但可能按 id 排序)。