使用少于或大于where子句与rails中的正则表达式

时间:2018-01-16 23:37:02

标签: ruby-on-rails regex

我需要编写一个查询,找到一个可以小于,小于或等于,大于,大于或等于与正则表达式结合的子句的数字。 有没有办法在查询中包含小于或大于子句,而不是重写正则表达式?

我需要根据特定条件获得包含小于或大于某个数字的所有答案。

到目前为止,我有这个:

my_regex = "(^|;)([#{value}])($|;)"
Model.where("answer ~* ?", my_regex)

这将返回包含值的记录,但如果我需要大于正则表达式的值,则不会返回。

例如,如果我需要大于2的值: 如果answer"1;3;5;6;7;10",我希望避免将正则表达式重写为"(^ |;)([#{value} -9] | 1 [0-9])($ | ;)"那可能吗?

1 个答案:

答案 0 :(得分:1)

answer列的格式很不幸,但并非毫无希望。您当前使用的~*运算符告诉我这是PostgreSQL,因此您可以将answer解压缩到SQL数组中:

regexp_split_to_array(answer, ';')::int[]

然后使用any查找所需的值:

...where("? < any(regexp_split_to_array(answer, ';')::int[])", 2)

::int[]是一种类型转换,用于将regexp_split_to_array提供的字符串数组转换为您想要进行比较的数字。然后检查任何数组元素是否大于2。

您还可以将answer列的格式更改为实际的整数数组,并说更简单:

...where('? < any(answer)', 2)

ActiveRecord也知道如何使用PostgreSQL数组,因此model.answer将成为Rails-land中的Ruby数组,而不会有任何额外的问题。