最近我们不得不通过“分页”来支持我们的网络应用
来 self 们数据库的 2 个不同模型(客户、查询)。
假设我们的页面大小为 5,
我们正在对“名字”进行排序。
因此我们接下来的所有“排序”操作都将按 first_name 排序
我们的过程在 :
中使用了 Sort 3 次- 数据库排序 - 客户模型。数据库返回 5 条记录。
- 数据库排序 - 查询模型。数据库返回 5 条记录。
- 将上述所有记录存储在一个数组中。
- Ruby 排序(使用 sort! 方法)- 按 FirstName 字段对以上 10 条记录进行排序。
- 将前 5 条记录呈现给客户端(排序后)。
我们的问题:
看来 Postgres 对字符串的排序和 Ruby 的排序有很大的不同。
例如,Postgres 和 Ruby 对以下单词的排序不同。
- w1 = '客户 1'
- w2 = '客户 - 你好'
排序结果:
Postgres: w1, w2
Ruby:w2、w1(相反)。
它在于Ruby comparator for Digit and Dash(-) character 与Postgres相反。
我们的问题仅在于“字符串”的排序。
按日期/整数排序是一样的(谢天谢地是这样)。
有谁知道是否可以覆盖/配置 Ruby 的排序? 因此,我们预期的数组排序结果将遵循 Postgres 排序的配置。
最佳答案
看来您需要自定义排序。这可以通过创建自定义方法来比较 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
然后在 ruby 排序中使用它:
["customer - hello", "customer 1"].sort!{|a, b| custom_compare(a, b)}
# => ["customer 1", "customer - hello"]
关于ruby-on-rails - Postgres 排序与 Ruby on Rails 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38586722/