Rails中基于字符串字段的SQL查询结果排序的最简单方法是什么?

3
考虑一个包含文本字段的表格,具体形式如下:
"foo,bar"

编辑: “bar”是逗号后的第一个字符串。 只有一个逗号。

如何以最简单的方式按bar排序? 可以使用SQL(PostgreSQL)或Ruby。


2
"bar"是什么?它总是从第3个位置开始的字符串吗?还是总是在第一个逗号后面的字符串? - Daniel Hilgarth
这总是在第一个逗号后的字符串。 - B Seven
2个回答

3
MyTable.all.sort_by { |r| r.my_text.match(/,(.*)$/)[1] }

1
非常有趣的解决方案。但是为什么要使用相对较慢的正则表达式,当使用split就足够了呢:my_text.split(',')[1] - Marek Příhoda
1
这可能是正确的方法@maprihoda,但@B Seven指定了“逗号后的第一个字符串”,而不是“第二个逗号分隔字段”。因此,上面的代码将匹配“foo,bar,baz”作为“bar,baz”,其中split [1]将匹配“bar”。 - Mori
1
@Mori 所以你正在对内存中的对象进行排序。但是如果有很多对象呢?那不会变得很慢且占用大量内存吗? - Marek Příhoda
@maprihoda - 是的,我会修改表。但现在我只想改变顺序而不修改它。反正记录很少... - B Seven
@maprihoda,是的。使用SQL的order by语句会更好。 - Mori
显示剩余2条评论

1

你可以在数据库内像这样做:

M.order("substring(c from ',.*$')")

其中M是您的模型,c是相关列。substring调用会在子字符串中保留逗号,但这不会改变排序方式,而且在排序过程中比尝试删除它们更快。此外,PostgreSQL的substring应该可以在8.2版本中使用,因此它应该可以与Heroku共享数据库一起使用。


@BSeven:如果你经常这样做,你可以在该函数调用的结果上添加索引;不过你可能需要手动维护该索引,我认为Rails迁移无法完成这个任务(但也许不是)。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接