1

我有一个类User,它有一个hstore属性:preferences。如果我想找到的所有用户凡在自己的喜好startpage关键是nil我可以这样做:Rails在hstore上的Postgres查询以避免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

@>运营商期望双方都有hstores。当你说:

some_hstore @> 'startpage=>NULL' 

PostgreSQL将隐式添加::hstore投,如果你曾说过:

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

但也有其他的方法来创建一个hstore。从fine manual

功能:hstore(text, text)
返回类型:hstore
说明:使单项hstore

所以,你可以切换到更明确hstore(text, text)功能,让ActiveRecord的做正常带有占位符和字符串的东西:

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