我正在尝试查询我的订单模型中的所有记录,但我希望它们以非常具体的方式排序。
数据库是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
答案 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
的文档希望有所帮助:)