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

标签 ruby-on-rails arrays ruby postgresql sorting

最近我们不得不通过“分页”来支持我们的网络应用

来 self 们数据库的 2 个不同模型(客户、查询)。


假设我们的页面大小为 5,

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

因此我们接下来的所有“排序”操作都将按 first_name 排序


我们的过程在 :

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

我们的问题:

看来 Postgres 对字符串的排序和 Ruby 的排序有很大的不同。

例如,Postgres 和 Ruby 对以下单词的排序不同。

  1. w1 = '客户 1'
  2. 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/

相关文章:

javascript - ruby on rails - 添加javascript

ruby-on-rails - 用户上传的背景?

c - 为什么我可以分配比 RAM 更大的数组?

javascript - 如何编写一个 javascript 函数来检查字符串中的第一个字符和最后一个字符是否相等

ruby - 使用 ruby​​ 代码中的 ruby​​ one liners

ruby-on-rails - 在 Rails 外部包含用户模型时未定义的方法 'devise'

ruby-on-rails - RSpec - 调用应该被模拟的私有(private)方法的测试方法

c - 指针数组的结构地址

javascript - 将 Javascript 的 getTime() 方法创建的时间转换为 ruby​​ Time 对象

ruby-on-rails - 使用本地 :path before deploy 检查 gem