【问题标题】:Regular expression in Rails scope not capturing the right valuesRails 范围内的正则表达式未捕获正确的值
【发布时间】:2018-10-09 11:12:10
【问题描述】:

当我有这样的值时,我想用“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" = $1 AND "game_results"."game_id" = $2 AND (short_result ~ (0')

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

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

【问题讨论】:

  • 如果您打算只返回以value 开头并后跟逗号的行,请尝试where('short_result LIKE ?', "#{value},%")
  • 我在日志中得到以下查询:(short_result LIKE '0, %'),它也没有返回任何结果..
  • 嗯,,% 之间应该没有空格。
  • 行是否总是像示例中那样排序(所以 0 总是在开头)?
  • @Vasfed 不,它会随机排列

标签: ruby-on-rails regex named-scope


【解决方案1】:

你可以使用

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

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

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

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

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

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

如果您只想匹配逗号或字符串开头/结尾之间的值

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

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

【讨论】:

  • 这不适用于不在开头的值或没有逗号的单个值
  • @Vasfed 当然,它不应该与开头的那些不匹配,请参阅 OP。
  • 查看 cmets 到 OP - 值是随机顺序的,即使数据与原始示例中的一样 - 尝试搜索 59
  • @Vasfed 我添加了几个额外的解决方案。
  • 我认为正确的是全词匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
相关资源
最近更新 更多