Rails Activerecord按字符串排序,包含数字

时间:2015-06-04 20:03:08

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord natural-sort

我有以下查询。 ASSOC是产品类别名称。

q = params[:category]
@products = Product.where("ISBN = ?" ,q).order('ASSOC')

我得到的内容如下:

16 CHANNEL SECURITY DVRS
32 CHANNEL SECURITY DVRS
4 CHANNEL SECURITY DVRS
8 CHANNEL SECURITY DVRS

我想要的是:

4 CHANNEL SECURITY DVRS
8 CHANNEL SECURITY DVRS
16 CHANNEL SECURITY DVRS
32 CHANNEL SECURITY DVRS

1 个答案:

答案 0 :(得分:0)

order方法只是将ORDER BY子句传递给数据库,由DB来提供实际的顺序。大多数数据库应该能够将您的字符串拆分成数字,并按数字顺序排序,而不是按字母顺序排序。我不确定你使用的是什么数据库,但这里有一个问题/答案显示如何为MySQL做这个:MySQL order by string with numbers

您可以通过在ORDER BY的调用中直接包含SQL来从Rails发送更长的order子句,例如:

order('SUBSTR(col_name FROM 1 FOR 1), CAST(SUBSTR(col_name FROM 2) AS UNSIGNED)')

作为替代方案,您可以避免使用order方法然后使用Ruby对结果进行排序(但效率会降低,因此如果您的数据库无法按照我的描述进行排序,那么您应该只进行排序上文)。