我在查询中转义反斜杠时遇到问题。我有一个看起来像这样的模型报告:
class Report < ActiveRecord::Base
belongs_to :person
end
和模型 Person 看起来像这样:
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
尝试在查询中使用 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有关详细信息和示例。祝你有美好的一天!
我是一名优秀的程序员,十分优秀!