Ruby PG Gem с использованием TextEncoder :: Array для SELECT WHERE имя поля в exec_params - PullRequest
0 голосов
/ 02 февраля 2019

Мне нужно искать поле идентификатора из массива.Я использую драгоценный камень PG, поэтому я думаю, что я должен использовать TextEncoder::Array.new.encode(myarray) для добавления в квалифицированный список.Структура PostgreSQL выглядит следующим образом:

SELECT id FROM tablename WHERE fieldname IN ('alpha', 'bravo', 'charlie')

Итак, мой начальный массив в Ruby будет ['alpha', 'charlie', 'bravo'], так что это мой текущий синтаксис:

a = ['alpha', 'bravo', 'ccharlie']
b = $conn.exec_params( %Q{ SELECT id FROM tablename WHERE fieldname IN ( $1 ) }, [ PG::TextEncoder::Array.new.encode(a) ] )
puts b.inspect

exec_params очевидно, принимает массив, даже если это один элемент массива.Но использование PG::TextEncoder::Array.new.encode(a) приводит к следующей структуре:

"{alpha,bravo,charlie}"

... которая является объектом (.class).Неправильный результат, который я получаю, состоит в том, что не найдено никаких записей, что является ложным.

Как разместить массив Ruby внутри в качестве первого PG параметра?

ОБНОВЛЕНИЕ :

Я использую:

...AND NOT (mytable.field = ANY ($6))

где $6 это:

PG::TextEncoder::Array.new(elements_type: PG::TextEncoder::String.new)

в PG::TypeMapByColumn.new случае.Массив Ruby, который там находится, действителен, содержит значение.В этом примере это одноэлементная строка в массиве, которая будет использоваться в моем операторе SQL.Все хорошо, но это не работает.Было бы полезно, если бы я действительно увидел SQL-выражение, отправленное на db.Слишком много скрыто здесь.

1 Ответ

0 голосов
/ 05 апреля 2019

Я нашел ответ: ...AND NOT hashtag = ANY ($1)..., где $ 1 является правильным Ruby array.Это на самом деле не поддерживается людьми PG gem.

...