Ruby on rails Postgres排序与Ruby on Rails排序

Ruby on rails Postgres排序与Ruby on Rails排序,ruby-on-rails,arrays,ruby,postgresql,sorting,Ruby On Rails,Arrays,Ruby,Postgresql,Sorting,最近我们不得不用“分页”来支持我们的web应用程序 我们的数据库提供了两种不同型号(客户、咨询)的数据 假设我们的页面大小是5 我们正在对“名字”进行排序 因此,我们下面所有的“排序”操作都将按名字排序 我们的流程在中使用排序3次: 数据库排序-客户模型。DB返回5条记录 数据库排序查询模型。DB返回5条记录 将上述所有记录存储在一个数组中 Ruby排序(使用sort!方法)-按FirstName字段对上述10条记录进行排序 将前5条记录呈现给客户端(排序后) 我们的问题: 似乎字符串的Po

最近我们不得不用“分页”来支持我们的web应用程序

我们的数据库提供了两种不同型号(客户、咨询)的数据


假设我们的页面大小是5

我们正在对“名字”进行排序

因此,我们下面所有的“排序”操作都将按名字排序


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

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

    似乎字符串的Postgres排序和Ruby排序是完全不同的

    例如,Postgres和Ruby对下列单词进行了不同的排序

  • w1=‘客户1’
  • w2='客户-您好'
  • 排序结果:

    博士后:w1,w2

    鲁比:w2,w1(相反)

    它位于face Ruby比较器中,数字和破折号(-)字符与Postgres相反


    我们的问题只存在于“字符串”的排序中

    按日期/整数排序的操作是相同的(谢天谢地是这样的)

    有人知道是否可以覆盖/配置Ruby的排序吗?
    因此,数组排序的预期结果将遵循Postgres排序的配置。

    您似乎需要自定义排序。这可以通过创建一个自定义方法来比较两个字符,以替换
    排序方法使用的默认
    字符来实现

    您可以按照自己的意愿实现字符串之间的比较操作(我的可能不是更好的操作,但至少它可以按照您的意愿反转破折号和数字之间的比较)

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

    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
    

    看来你需要一个定制的排序。这可以通过创建一个自定义方法来比较两个字符,以替换
    排序方法使用的默认
    字符来实现

    您可以按照自己的意愿实现字符串之间的比较操作(我的可能不是更好的操作,但至少它可以按照您的意愿反转破折号和数字之间的比较)

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

    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
    

    排序需要一个块,您可以按照自己的意愿进行排序。没有“Postgres排序”这样的东西。Postgres排序的方式几乎不依赖于在特定表/列上设置的排序规则。PostgreSQL使用操作系统排序规则进行排序。
    SHOW lc\u collate,你能得到什么在您的数据库中?这就是你需要的命令。@SergioTulentsev不幸的是,这个特别的错误赢得了我所有的反对。我到处都这样做。有一次,我在100多名客户面前看到一张幻灯片,上面写着“我们几乎没有尽力”。我最喜欢的是“我吃饱了”(例如,我不能再吃了)时的“我受够了”。在美国英语中,“受够了”的意思是“极度沮丧,再也受不了了”。语言很有趣@SergioTulentsevSort需要一个块,您可以根据需要进行排序。没有“Postgres排序”这样的东西。Postgres排序方式几乎不依赖于在特定表/列上设置的排序规则。PostgreSQL使用操作系统排序规则进行排序。
    SHOW lc\u collate,你能得到什么在您的数据库中?这就是你需要的命令。@SergioTulentsev不幸的是,这个特别的错误赢得了我所有的反对。我到处都这样做。有一次,我在100多名客户面前看到一张幻灯片,上面写着“我们几乎没有尽力”。我最喜欢的是“我吃饱了”(例如,我不能再吃了)时的“我受够了”。在美国英语中,“受够了”的意思是“极度沮丧,再也受不了了”。语言很有趣@SergioTulentsevI已经在使用自定义排序了。按名称排序实际上是按:first_Name,last_Name,Ruby中相应的排序是自定义的,再次按first_Name,last_Name排序。问题在于,字符串上的Ruby排序操作与PostgresDB的行为不同。我不能为每2个字符覆盖每个比较。是的,因此您应该将
    排序分解为它的比较操作,并对其进行更改。我已经用一个
    自定义的\u compare
    方法更新了我的答案,在这个方法中,我尝试将破折号和整数之间的比较颠倒过来。对于我认为已经存在的东西,计算量很大。我指的是其他人提到的“排序规则”。按照您的方式,为了保证Ruby和my DB中的行为相同,我需要覆盖每2个字符之间的每个比较。最多N选择2个覆盖…如果它已经存在,它将是等效的。本地方法并不比您自己设计的方法更有效。我不是说我的
    custom\u compare
    是一个,我是说你应该构建你的。我已经在使用自定义排序了。按名称排序实际上是按:first_Name,last_Name,Ruby中相应的排序是自定义的,再次按first_Name,last_Name排序。问题在于,字符串上的Ruby排序操作与PostgresDB的行为不同。我不能为每2个字符覆盖每个比较。是的,因此您应该将
    排序分解为它的比较操作,并对其进行更改。我已经用一个
    自定义的\u compare
    方法更新了我的答案,在这个方法中,我尝试将破折号和整数之间的比较颠倒过来。对于我认为已经存在的东西,计算量很大。我指的是其他人提到的“排序规则”。按照您的方式,为了保证Ruby和my DB中的行为相同,我需要覆盖每2个字符之间的每个比较。最多N选择2个覆盖…如果它已经存在,它将是等效的。本地方法并不比您自己设计的方法更有效。我不是说我的<