我在查询中转义反斜杠时遇到问题。我有一个模型报告,如下所示:
class Report < ActiveRecord::Base
belongs_to :person
end
和模型看起来像这样的人:
class Person < ActiveRecord::Base
attr_accessible :first_name, :last_name, :middle_name
end
我的查询看起来像这样:
Report.includes(:person).where("concat_ws(' ', lower(people.first_name), lower(people.middle_name), lower(people.last_name)) ~* :keyword", {keyword: "User name"}).references(:people)
当用户在搜索反斜杠中键入时,该查询的问题是无效:
Report.includes(:person).where("concat_ws(' ', lower(people.first_name), lower(people.middle_name), lower(people.last_name)) ~* :keyword", {keyword: "User name\"}).references(:people)
然后它返回:
PG::InvalidRegularExpression: ERROR: invalid regular expression: invalid escape \ sequence
答案 0 :(得分:1)
尝试在查询中使用LIKE
,而不是~*
,这样用户输入就不会被解释为正则表达式。
更新:将您的用户输入包含在%
中,如下所示:
Report.includes(:person).where("concat_ws(' ', people.first_name, people.middle_name, people.last_name) ILIKE :keyword", { keyword: "%#{params[:input]}%" }).references(:people)
ILIKE执行不区分大小写的搜索,因此您不再需要lower
。
您可能还需要转义用户输入中的任何_
或%
,以便它不会被Postgres解释为特殊符号(_
代表任何字符和%
代表任意数量的字符。)
查看docs了解详细信息和示例。祝你有愉快的一天!