Rails字符串列中的字数大于?

时间:2014-10-09 05:17:16

标签: postgresql ruby-on-rails-4

我需要根据某列中存在多少个单词来过滤记录。

以下作品,但当然会返回一个字符数...我需要一个字数

 Flight.where("length(route) > 3")

这样做是否有轨道(或任何方式)?

这种情况越来越近了(它正好在rails docs之外),但却导致错误

 Flight.where("array_length(route, 1) >= 3")

 ERROR: aggregate functions are not allowed in WHERE
 ERROR:  function array_length(character varying, integer) does not exist

文档还建议使用HAVING ..也无效

Flight.having("route.count > ?", 2)

3 个答案:

答案 0 :(得分:1)

您可以使用split从字符串创建一个数组,其中的字符串用字符串中的空格分隔并计算总数。

Flight.select(:route).select { |flight| flight.route.split(" ").length > 3 }

答案 1 :(得分:0)

假设你想要一个天真的“单词”定义为“中间有空格的东西”,拆分字符串并得到结果数组的长度。

在纯SQL中,那就是:

SELECT array_length(string_to_array(route, ' '), 1);

e.g。

SELECT array_length(string_to_array('this is - five, words', ' '), 1);

如果您想获得更高级并忽略标点符号等,请使用regexp_split_to_array。如果需要,您还可以使用to_tsvector创建一个词干和去重复的表单。

答案 2 :(得分:0)

Flight.where(“array_length(route,1)> = 3”)确实有效,但该列必须设置为类型数组。

请参阅此帖子了解更多Rails Migration changing column to use Postgres arrays