相关疑难解决方法(0)

根据另一个数组的元素对数组进行排序

我有一系列的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)时间.有人可以告诉我最有效的排序方式吗?

ruby arrays sorting algorithm

39
推荐指数
4
解决办法
2万
查看次数

清洁方式按指定的顺序按ID查找ActiveRecord对象

我想获得一个给定一组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代码来自己对对象进行排序(有点简单,缩放比例较差或缩放比较复杂),但是有更好的方法吗?

sqlite activerecord ruby-on-rails find rails-activerecord

26
推荐指数
4
解决办法
2万
查看次数

Rails,ActiveRecord,在int数组中查询id,保持传递数组的顺序

我正在考虑解决问题的最佳方案.假设我们有一个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对象列表?也许有一种更聪明的方法可以做到这一点.

谢谢!

ruby-on-rails ruby-on-rails-4

16
推荐指数
3
解决办法
4390
查看次数

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端进行排序是不可取的,因为它资源昂贵并且难以与分页一起使用.

谢谢.

sorting activerecord ruby-on-rails

13
推荐指数
3
解决办法
3030
查看次数

钢轨的状况和顺序

知道默认情况下 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]

我假装的结果在两种情况下都是相同的(相同的顺序)。返回公司的顺序应与创建该公司的书签的顺序相同。

activerecord ruby-on-rails activemodel

5
推荐指数
1
解决办法
6126
查看次数

查找带有 ids 的记录并保持与 ids 数组中相同的顺序

我有 ids 数组ids = [5,2,1,6]

我想找到具有这些 id 的所有记录并保持与ids数组中相同的顺序。

常规records = Product.find(ids)不保留此顺序(不确定,但可能按 id 排序)。

ruby ruby-on-rails ruby-on-rails-4

0
推荐指数
1
解决办法
1459
查看次数