Ruby按块排序而不转换为数组

q1qsirdb  于 2023-04-05  发布在  Ruby
关注(0)|答案(2)|浏览(130)

我的数据库有一个列,在同一字段中包含客户的名字和姓氏(它是通过API以这种方式格式化的)。
要按客户的姓氏排序,我需要拆分字符串。

schedule_projects.sort_by{|x| x.sold_to_name.split(" ").last}

然而,对于我们在这个应用程序中进行的所有其他排序,我们使用order方法,然后调用.page
但是sort_by方法返回的是一个数组而不是ActiveRecord关系。而且你不能在数组上调用.page。
作为一个临时的解决方案,我们只是在sold_to_name上调用.order。但是我们真的希望能够按照客户的姓氏对这些进行排序。有没有办法在不将输出转换为数组的情况下按照块进行排序?

qnakjoqk

qnakjoqk1#

PostgreSQL有split_part函数。第一个参数是文本,第二个参数是分隔符,第三个参数是位置,在本例中是最后一个。

schedule_projects.order(Arel.sql("split_part(sold_to_name, ' ', -1)"))
tnkciper

tnkciper2#

在不加载记录的情况下按块排序实际上是不可能的。为了在Ruby中处理记录,您需要实际将数据放入应用程序中。
一个简单的解决方案是在order子句中使用SUBSTRING或SPLIT_PART等数据库函数将字符串分解为多个部分。它将工作得很好,直到它实际遇到现实,你必须处理:

  • 带前缀或后缀的名称。
  • 多个姓氏。
  • 不使用名字姓氏约定的区域性。
  • 只有一个名字的人。
  • ...

不幸的是,通过编程将全名分割成其组成部分的想法被打破了,如果没有良好的输入数据,您实际上将无法正确地实现这一点。

相关问题