我看到一些Airbrake错误告诉我,我的用户在搜索PSQL认为是REGEX的事情时遇到问题,实际上它应该将其视为纯字符串。
错误是:
Parameters: {"terms"=>"P[", "id"=>"29"}
Inventory Load (0.5ms) SELECT name, number, id FROM "inventories" WHERE (name ~* 'P[' OR number ~* 'P[')
PG::InvalidRegularExpression: ERROR: invalid regular expression: brackets [] not balanced
: SELECT name, number, id FROM "inventories" WHERE (name ~* 'P[' OR number ~* 'P[')
Completed 500 Internal Server Error in 117.8ms
ActiveRecord::StatementInvalid (PG::InvalidRegularExpression: ERROR: invalid regular expression: brackets [] not balanced
: SELECT name, number, id FROM "inventories" WHERE (name ~* 'P[' OR number ~* 'P[')):
我的代码使用PSQL的模糊搜索来搜索整个单元格以查找字符串中的任何位置:
@inventory =
Inventory.select("name, number, id")
.where("name ~* :key OR number ~* :key", :key => key)
用户从UI中的搜索字段将键传递给此方法。有人试图将库存项目存储为类似“P [akjhdfkgjhdg]'现在他们想要搜索它。他们应该能够。
为什么PSQL将其解释为REGEX?
编辑:
提交的答案标记为重复'不是我要问的。我不是问如何逃避括号。我问如何SANITIZE一个STRING(我不知道字符串中可能存在哪些字符),这样当ActiveRecord为DB创建sql时,任何字符可能会让Postgres误以为我和#39;传递一个REGEX进行消毒,以便将它们视为一个共同的字符串。
我无法想象每个符号客户可能会进入搜索字段,因此我无法想出一些疯狂的匹配器来检查事物。我想要像#sanitize_array'或者'消毒'在Ruby / Rails中,我已经尝试过在API Dock上记录的这些方法,但它们都不起作用。