Ruby on rails Postgres排序与Ruby on Rails排序
最近我们不得不用“分页”来支持我们的web应用程序 我们的数据库提供了两种不同型号(客户、咨询)的数据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
假设我们的页面大小是5 我们正在对“名字”进行排序 因此,我们下面所有的“排序”操作都将按名字排序
我们的流程在中使用排序3次:
我们的问题只存在于“字符串”的排序中 按日期/整数排序的操作是相同的(谢天谢地是这样的) 有人知道是否可以覆盖/配置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个覆盖…如果它已经存在,它将是等效的。本地方法并不比您自己设计的方法更有效。我不是说我的<