我正在尝试搜索具有关联的唯一模型,其中关联模型的属性“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”附近
我遇到了类似的错误,在我的情况下,通过使用 Regexp#source 获取 ActiveRecord::QueryMethods#where:
所需的字符串来解决该错误>> User.where("name ~ ?", /foo/)
TypeError: can't quote Regexp
>> User.where("name ~ ?", (/foo/).source)
=> []