2

我收到按“收入”排序的用户 ID 列表(一次大约 1000 个)。我在“我的系统数据库”中有用户记录,但没有“收入”列。我想从列表中收到的排序顺序中的“我的系统数据库”中检索用户。我尝试使用 Active Record 执行以下操作,期望记录的检索顺序与排序列表中的顺序相同,但它不起作用。

//PSEUDO CODE
User.all(:conditions => {:id => [SORTED LIST]})

我在下面的链接中找到了类似问题的答案,但不确定如何使用 Active Record 实施建议的解决方案。

按 IN 值列表排序

还有其他方法吗?

请指导。

沙杜尔。

4

2 回答 2

6

您链接到的答案正是您所需要的,您只需要以灵活的方式在 Ruby 中对其进行编码。

像这样的东西:

class User
  def self.find_as_sorted(ids)
    values = []
    ids.each_with_index do |id, index|
      values << "(#{id}, #{index + 1})"
    end
    relation = self.joins("JOIN (VALUES #{values.join(",")}) as x (id, ordering) ON #{table_name}.id = x.id")
    relation = relation.order('x.ordering')
    relation
  end
end

事实上,你可以很容易地将它放在一个模块中并将它混合到任何需要它的 ActiveRecord 类中,因为它使用table_name并且self它没有用任何特定的类名实现。

于 2012-08-22T19:48:36.197 回答
0

MySQL 用户可以通过该FIELD函数执行此操作,但 Postgres 缺少它。但是这个问题有解决方法:Simulating MySQL's ORDER BY FIELD() in Postgresql

于 2012-08-17T20:15:17.363 回答