Postgres排序与Ruby on Rails排序

时间:2016-07-26 09:58:08

标签: ruby-on-rails arrays ruby postgresql sorting

最近我们不得不支持我们的网页应用程序'分页'

来自我们数据库的2种不同型号(客户,查询)。

我们假设页面大小为5,

我们正在排序'名字'。

因此,我们所有的追随者'排序'操作将按first_name

排序

我们的流程使用排序 3次:

  1. 数据库排序 - 客户模型。 DB返回5条记录。
  2. 数据库排序 - 查询模型。 DB返回5条记录。
  3. 将所有上述记录存储在一个数组中。
  4. Ruby排序(使用 sort!方法) - 按FirstName字段对上述10条记录进行排序。
  5. 将前5条记录呈现给客户端(排序后)。
  6. 我们的问题:

    对于字符串,Postgres排序和Ruby排序似乎完全不同。

    例如,Postgres和Ruby对这些词进行了不同的排序。

    1. w1 ='客户1'
    2. w2 ='客户 - 你好'
    3. 排序结果:

      Postgres:w1,w2

      Ruby:w2,w1(相反)。

      它位于脸部Ruby比较器的数字和短跑( - )字符与Postgres相反。

      我们的问题仅在于排序' Strings'

      按日期/整数排序的行为相同(感谢上帝)。

      有谁知道是否可以覆盖/配置Ruby的排序? 因此,我们对Array排序的预期结果将遵循Postgres排序的配置。

1 个答案:

答案 0 :(得分:0)

您似乎需要自定义排序。这可以通过创建自定义方法来比较2个字符以重新设置<=>方法使用的默认sort来实现。

你可以在你想要的字符串之间实现一个比较操作(我的可能不是更好的,但至少它可以按照你的意愿反转短划线和数字之间的比较)。

以下是我自定义比较方法的示例:

def custom_compare(s1, s2)
  s1_array = s1.split("")
  s2_array = s2.split("")
  s1_array.each_with_index do |c1, i|
    c2 = s2_array[i]
    if c1 != c2
      if(c1 == "-" && c2 =~ /\d/ || c2 == "-" && c1 =~ /\d/)
        return c1 == "-" ? 1 : -1
      end
      return c1 <=> c2
    end
  end
  return 0
end

然后在红宝石中使用它:

["customer - hello", "customer 1"].sort!{|a, b| custom_compare(a, b)}
# => ["customer 1", "customer - hello"]