【问题标题】:Postgres ORDER BY values in IN list using Rails Active Record使用 Rails Active Record 在 IN 列表中的 Postgres ORDER BY 值
【发布时间】:2012-08-17 20:11:49
【问题描述】:

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

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

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

ORDER BY the IN value list

还有其他方法吗?

请指导。

沙杜尔。

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord sql-order-by in-clause


    【解决方案1】:

    您链接到的答案正是您所需要的,您只需以灵活的方式用 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_nameself,它没有使用任何特定的类名实现。

    【讨论】:

    • ids 为空怎么办?我已经尝试过了,似乎在这种情况下你会得到一个错误。
    【解决方案2】:

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

    【讨论】:

    • 根据上面链接中的答案,我必须创建一个数据库函数来实现我想要的。我对吗?不知何故,我不太习惯将任何东西推送到数据库(一个函数或一个过程)。还有其他方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2011-07-16
    • 2017-09-24
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多