1

У меня есть класс User, который имеет атрибут hstore:preferences. Если я хочу, чтобы найти все пользователь, где startpage ключа в своих предпочтениях nil я могу сделать:Rails Запрос Postgres на hstore, чтобы избежать SQL-инъекции

User.where("preferences @> 'startpage=>NULL'") 

Как можно структурировать этот запрос, так что позволяет избежать инъекций запроса SQL?

Пробовал:

User.where("preferences @> :key '=>NULL'", key: 'startpage') 
User.where("preferences @> :key IS 'NULL'", key: 'startpage') 
User.where("preferences @> :key IS NULL", key: 'startpage') 
User.where("preferences @> ? IS NULL", 'startpage') 

Без везения. Кто-нибудь знает, как это сделать?

ответ

1

Оператор @> ожидает, что с обеих сторон будут расположены магазины. Когда вы говорите:

some_hstore @> 'startpage=>NULL' 

PostgreSQL неявно добавить ::hstore оттенок, как если бы вы сказали:

some_hstore @> 'startpage=>NULL'::hstore 

Но есть и другие способы создания hstore. Из fine manual:

Функция: hstore(text, text)
Return Тип: hstore
Описание: сделать одну вещь hstore

Таким образом, вы можете перейти к более явной hstore(text, text) функции и пусть ActiveRecord сделать его нормальным вещь с заполнителями и строками:

User.where("preferences @> hstore(:key, null)", :key => 'start page')