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
模式应该匹配整个记录。这里,value
是0
,所以记录应该以0
开头。然后,应该跟一个逗号。然后 %
通配符匹配记录末尾的任何 0+ 个字符。
如果您打算将值作为一个完整的词进行匹配,则需要
.where('short_result ~ ?', "\y#{value}\y")
PostgreSQL 正则表达式语法中的 \y
是一个单词边界,与类 Perl 正则表达式中的 \b
相同。
如果您只想匹配逗号或 start/end 字符串之间的值,请使用
.where('short_result ~ ?', "(^|,)#{value}($|,)")
(^|,)
匹配字符串的开头 (^
) 或 (|
) 逗号,而 ($|,)
匹配字符串的结尾 ($
) 或逗号。
当我有这样的值时,我想捕获带有“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
模式应该匹配整个记录。这里,value
是0
,所以记录应该以0
开头。然后,应该跟一个逗号。然后 %
通配符匹配记录末尾的任何 0+ 个字符。
如果您打算将值作为一个完整的词进行匹配,则需要
.where('short_result ~ ?', "\y#{value}\y")
PostgreSQL 正则表达式语法中的 \y
是一个单词边界,与类 Perl 正则表达式中的 \b
相同。
如果您只想匹配逗号或 start/end 字符串之间的值,请使用
.where('short_result ~ ?', "(^|,)#{value}($|,)")
(^|,)
匹配字符串的开头 (^
) 或 (|
) 逗号,而 ($|,)
匹配字符串的结尾 ($
) 或逗号。