Search code examples
arraysrubypostgresqlpg

Ruby PG Gem Using TextEncoder::Array for SELECT WHERE fieldname IN exec_params


I need to search for id field from an array. I'm using the PG gem, so I'm thinking I should be using TextEncoder::Array.new.encode(myarray) to shove in the qualified list. The PostgreSQL structure is as follows:

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

So my starting array in Ruby would be ['alpha', 'charlie', 'bravo'], so this is my current syntax:

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 obviously takes an array, even it's a single array element. But using PG::TextEncoder::Array.new.encode(a) results in the following structure:

"{alpha,bravo,charlie}"

...which is an object (.class). The improper result I'm getting is that there are no records found, which is false.

How can I place a Ruby array inside as the first PG parameter?

UPDATE:

I've been using:

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

where $6 is this:

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

in a PG::TypeMapByColumn.new instance. The Ruby array that's going in there, is valid, holds a value. It is, in this example, a one-element string in an array, to be used in my SQL statement. All is good, but it isn't working. It would help if I actually saw the SQL statement sent to the db. Too much is hidden here.


Solution

  • I found the answer: ...AND NOT hashtag = ANY ($1)... where $1 is a proper Ruby array. It's not actually supported by the PG gem people.