Запрос Hstore ActiveRecord с использованием подстановочных знаков для ключей и значений

Я хочу использовать такой запрос в своем приложении rails:

Series.where("dimensions @> 'a=>1, b=>2'::hstore")

За исключением того, что мне нужно использовать подстановочные знаки (или именованные параметры), чтобы не создавать ошибку SQL-инъекции:

Series.where("dimensions @> '?=>?, ?=>?'::hstore", 'a', '1', 'b', '2')

Последнее, однако, не работает, потому что hstore не ожидает, что ключи/значения будут заключены в одинарные кавычки. Вот ошибка:

PG::SyntaxError: ERROR:  syntax error at or near "a"
LINE 1: ... "series".* FROM "series"  WHERE (dimensions @> ''a'=>'1', '...
                                                             ^
: SELECT "series".* FROM "series"  WHERE (dimensions @> ''a'=>'1', 'b'=>'2''::hstore)

Как правильно использовать подстановочные знаки с hstore?

Спасибо!


person vrepsys    schedule 26.01.2014    source источник


Ответы (1)


Существуют и другие способы создания hstore, чем используя преобразование текста в hstore:

  • hstore(text[]): создать hstore из массива, который может быть либо массивом ключ/значение, либо двумерным массивом.
  • hstore(text[], text[]): создать hstore из отдельных массивов ключей и значений.
  • hstore(text, text): создать магазин с одним товаром.

Итак, вы можете сделать следующее:

hstore('k', 'v')                             -- "k"=>"v"
hstore(array['k1', 'k2'], array['v1', 'v2']) -- "k1"=>"v1", "k2"=>"v2"
hstore(array['k1', 'v1', 'k2', 'v2'])        -- "k1"=>"v1", "k2"=>"v2"
hstore(array[['k1', 'v1'], ['k2', 'v2']])    -- "k1"=>"v1", "k2"=>"v2"

Возможно, вы добьетесь большего успеха с этим:

Series.where('dimensions @> hstore(array[:k1, :v1, :k2, :v2])',
  :k1 => 'a', :v1 => '1',
  :k2 => 'b', :v2 => '2'
)

В этой версии есть только один уровень кавычек, поэтому AR не должен создавать беспорядка. Я также переключился на именованные заполнители по пути, более чем пара анонимных заполнителей сбивает с толку.

person mu is too short    schedule 26.01.2014