Интерполяция массива PG в сыром запросе SQL - PullRequest
0 голосов
/ 16 октября 2018

В приложении Rails (5.2) с PG (10) в качестве базы данных мне нужно выполнить необработанный SQL-запрос.

В запросе мне нужно добавить предложение WHERE, которое проверяетqp.id входит в число project.qp_ids, которые хранятся в виде массива строк.

t.text :qp_ids, array: true, default: []

Я пробовал несколько решений, среди которых следующие

" ... WHERE qp.id = ANY #{project.qp_ids}"
" ... WHERE qp.id = ANY #{project.qp_ids.join(', ')}"
" ... WHERE qp.id = ANY ARRAY(#{project.qp_ids.join(', '))}"
" ... WHERE qp.id = IN (#{project.qp_ids.join(', ')})"

Но все выдают PG::SyntaxError.

Как правильно интерполировать массив PG?

UPDATE1

Приведенный ниже код работает, но очень уродливо,

" ... WHERE qp.id = IN (#{self.quality_process_ids.map {|id| "'#{id}'"}.join(',')})"

1 Ответ

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

Не будет ли проще использовать IN?

" ... WHERE qp.id IN (#{project.qp_ids.join(',')})"

Чтобы справиться со строковыми кавычками, вы можете использовать санацию ActiveRecord напрямую

your_model_instance.sanitize_sql_array(["project.qp_ids IN (?)", project.qp_ids])
 => "project.qp_ids IN ('foo','bar')"

длясгенерируйте условие, которое вы можете использовать в вашем предложении WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...