Мне нужно искать поле идентификатора из массива.Я использую драгоценный камень 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
.Слишком много скрыто здесь.