Rails 范围内的正则表达式未捕获正确的值

Regular expression in Rails scope not capturing the right values

当我有这样的值时,我想捕获带有“0”的行:

"0,1,8,9,10"
“10”
0,1”
“4,5”
“1,5,10”

我继承的代码同时捕获了“0”和“10”的值,这是错误的:

scope :short_result_contains_value, -> (game_id, value) { where(game_id: game_id).where('short_result LIKE ?', "%#{value}%")

我正在尝试使用正则表达式来加强搜索查询,但我根本无法让正则表达式捕获任何值:

scope :short_result_contains_value, -> (game_id, value) { where(game_id: game_id).where('short_result ~ ?', "/\b(#{value})\b/")}

当我 运行 它时,我在日志中看到以下查询正在 运行:

SELECT "game_results".* FROM "game_results" WHERE "game_results"."game_id" =  AND "game_results"."game_id" =  AND (short_result ~ (0')

ActiveRecord 没有捕获任何应该捕获的值。如何修复正则表达式?谢谢!

我正在使用 Postgres 并使用 Rails 4.2、Ruby 2.3.7。

您可以使用

where('short_result LIKE ?', "#{value},%")

它只会 return 以 value 开头并后跟逗号的行。

LIKE 模式应该匹配整个记录。这里,value0,所以记录应该以0开头。然后,应该跟一个逗号。然后 % 通配符匹配记录末尾的任何 0+ 个字符。

如果您打算将值作为一个完整的词进行匹配,则需要

.where('short_result ~ ?', "\y#{value}\y")

PostgreSQL 正则表达式语法中的 \y 是一个单词边界,与类 Perl 正则表达式中的 \b 相同。

如果您只想匹配逗号或 start/end 字符串之间的值,请使用

.where('short_result ~ ?', "(^|,)#{value}($|,)")

(^|,) 匹配字符串的开头 (^) 或 (|) 逗号,而 ($|,) 匹配字符串的结尾 ($) 或逗号。