使用正则表达式进行高级活动记录顺序

时间:2016-07-14 18:24:17

标签: ruby-on-rails ruby postgresql activerecord rails-activerecord

我正在尝试查询我的订单模型中的所有记录,但我希望它们以非常具体的方式排序。

数据库是PostgreSQL数据库。

我希望所有记录首先以NY开头,然后是NYN,然后是所有剩余记录。

我想我正在尝试做这样的事情:

Order.all.order('order_number /^NY/, /^NYN/')

数据示例:

NY-1111111
NYN-1234567
P-000000
P0000000
SS0232131
NYN16151202

我想要的订单是:

NY-1111111
NYN16151202
NYN-1234567
P0000000
P-000000
SS0232131

2 个答案:

答案 0 :(得分:4)

以下是在SQL中执行此操作的一种方法:

Area = t.Area,
Description = t.Area.HasValue ? a : b, 

这可以直接翻译成ActiveRecord查询:

SELECT * FROM orders
  ORDER BY
    CASE
      WHEN order_number LIKE 'NYN%' THEN 1
      WHEN order_number LIKE 'NY%' THEN 0
      ELSE 2
    END,
    order_number;

这是使用PostgreSQL的POSIX正则表达式的另一种可能性。我不确定它与上述性能的比较:

Order.order("
  CASE
    WHEN order_number LIKE 'NYN%' THEN 1
    WHEN order_number LIKE 'NY%' THEN 0
    ELSE 2
  END,
  order_number
")

答案 1 :(得分:2)

你可以通过像这样的ruby sort_by方法来做到这一点:

orders = Order.all.sort_by{ | order |
    if order.name =~ /^NYN/
        -1;
    elsif order.name =~ /^NY/
        -2;
    else
        0;
    end
}

因此,如果订单名称为:["ghi", "NYabc", "jk", "NYNdef"],则订单为:["NYabc", "NYNdef", "ghi", "jk"]["NYabc", "NYNdef", "jk", "ghi"]

您可以找到sort_by here

的文档

希望有所帮助:)