将正则表达式作为查询传递到 postgresql 数据库而不是 Rails 中的选项数组

问题描述 投票:0回答:1

我正在尝试搜索具有关联的唯一模型,其中关联模型的属性“description”包含搜索查询中的单词。我只想找到完全匹配的模型,例如如果用户正在搜索“egg”,我希望搜索包含带有“description”的模型,包括例如:“egg”、“eggs”、“egg”、“eggs”、“Egg”等等,但我不希望搜索在其 description 属性中包含带有“eggplant”的模型。因此,我提供了一系列选项,以便搜索将选取完全匹配的所有内容,并且它位于description的开头、中间和结尾,而且,如果查询中的单词存在复数版本在 description 内或后跟逗号。

options = [
            "#{query} %",
            "#{query}s %",
            "#{query}s,%",
            "#{query},%",
            "% #{query} %",
            "% #{query}s %",
            "% #{query}s,%",
            "% #{query},%",
            "% #{query}s",
            "% #{query}"
          ]


@response ||= Model.joins(:associated_models).where(AssociatedModel.arel_table[:name].matches_any(options)).distinct

上面的方法有效,但是,我想知道是否有更好的方法,也许可以通过将 RegExp 传递到查询中而不是选项数组中,例如:

编辑

# query is either at the beginning of the description or is following the white space or it is followed by the white space or comma or an 's'
regexp_query = /(^|\s)#{query}($|\s|,)/

@response ||= Model.joins(:associated_models).where(AssociatedModel.arel_table[:name].matches(regexp_query)).distinct

or

@response ||= Model.joins(:associated_models).where('associated_models.name ILIKE ?', regexp_name).distinct

我尝试使用 'REGEXP' 或 '~*' 而不是 'ILIKE' 但出现类似 -can't quote Regexp 或 -PG::SyntaxError: ERROR: 语法错误 at或“REGEXP”附近

regex postgresql ruby-on-rails-5
1个回答
0
投票

我遇到了类似的错误,在我的情况下,通过使用 Regexp#source 获取 ActiveRecord::QueryMethods#where:

所需的字符串来解决该错误
>> User.where("name ~ ?", /foo/)
TypeError: can't quote Regexp

>> User.where("name ~ ?", (/foo/).source)
=> []
© www.soinside.com 2019 - 2024. All rights reserved.