Регулярное выражение в области Rails не захватывает правильные значения - PullRequest
0 голосов
/ 09 октября 2018

Я хотел бы захватить строки с "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.

1 Ответ

0 голосов
/ 09 октября 2018

Вы можете использовать

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

Он будет возвращать только строки, начинающиеся с value и заканчивающиеся запятой.

Шаблон LIKE должен соответствовать всей записи.Здесь value равно 0, поэтому запись должна начинаться с 0.Затем должна следовать запятая.Тогда подстановочный знак % соответствует любым 0+ символам в конце записи.

Если вы планируете сопоставить значение как целое слово, вам нужно

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

The \y в PostgreSQL синтаксис регулярных выражений представляет собой границу слова, такую ​​же как \b в Perl-подобных регулярных выражениях.

Если вы хотите сопоставить значение только между запятыми или началом / концом строки, используйте

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

(^|,) соответствует началу строки (^) или (|) запятой, а ($|,) соответствует либо концу строки ($), либо запятой.

...