正确地逃避反斜杠

时间:2015-09-13 18:33:14

标签: ruby-on-rails ruby postgresql activerecord

我在查询中转义反斜杠时遇到问题。我有一个模型报告,如下所示:

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

1 个答案:

答案 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了解详细信息和示例。祝你有愉快的一天!