【问题标题】:filterrific : How to search query with multiple words?filterrific : 如何用多个词搜索查询?
【发布时间】:2018-05-23 12:18:06
【问题描述】:

我正在使用filterrific 制作过滤器。

假设我得到一个将locality 设置为“纽约”的对象。

使用目前的代码,如果我只用一个词搜索它就可以工作,例如:“新”。如果我写“纽约”,什么都不会出现。

filterrific 示例中,过滤器允许用户在“查询”中写几个词。

型号

  scope :search_query, lambda { |query|
  return nil  if query.blank?
    terms = query.downcase.split(/\s+/)
    terms = terms.map { |e|
      (e.gsub('*', '%') + '%').gsub(/%+/, '%')
    }
    num_or_conds = 2
    where(
      terms.map { |term|
        "(LOWER(title) LIKE ? OR LOWER(locality) LIKE ?)"
      }.join(' AND '),
      *terms.map { |e| [e] * num_or_conds }.flatten
    )
  }



filterrific(
   default_filter_params: {},
   available_filters: [
     :search_query
   ]
 )

控制器

def index
   @filterrific = initialize_filterrific(
     @ads,
     params[:filterrific]
   ) or return
    @ads = @filterrific.find.page(params[:page])
end

查看

  = form_for_filterrific @filterrific do |f|
    div
      | Search
      = f.text_field :search_query, class: 'skills field w-input filterrific-periodically-observed', placeholder: "Job title, keywords, skills..."

      = f.submit 'GO !', {class: "submit-b w-button"}

编辑

日志

 Ad Load (1.2ms)  SELECT  "ads".* FROM "ads" WHERE (publishing_at <= '2018-05-24') AND (expiring_at >= '2018-05-24') AND ((LOWER(title) LIKE 'new%' OR LOWER(locality) LIKE 'new%') AND (LOWER(title) LIKE 'york%' OR LOWER(locality) LIKE 'york%')) LIMIT $1 OFFSET $2  [["LIMIT", 20], ["OFFSET", 0]]

【问题讨论】:

  • 你的search_query范围在哪里?您的问题涉及 locality 字段,但代码示例中没有提及。
  • @TomLord 是的,对不起,我忘了编辑这部分。您现在可以查看search_query 范围,该范围位于titlelocality
  • 你看过生成的SQL了吗? (它是什么?)这个 SQL 是否匹配记录? (如果没有,为什么不呢?)
  • 查看 SQL 的最简单方法可能是查看 logs/development.log
  • @TomLord 我用 SQL 日志编辑我的帖子

标签: ruby-on-rails ruby filterrific


【解决方案1】:

从你的 SQL 日志可以看出问题:

...
AND ((LOWER(title) LIKE 'new%' OR LOWER(locality) LIKE 'new%')
AND (LOWER(title) LIKE 'york%' OR LOWER(locality) LIKE 'york%'))

所需的 SQL应该是:

...
AND ((LOWER(title) LIKE '%new%' OR LOWER(locality) LIKE '%new%')
AND (LOWER(title) LIKE '%york%' OR LOWER(locality) LIKE '%york%'))

因为“新”在locality开始,所以匹配;但是因为“york”不是开头,所以不匹配。

要解决此问题,您可以替换以下行:

(e.gsub('*', '%') + '%').gsub(/%+/, '%')

与:

('%' + e.gsub('*', '%') + '%').gsub(/%+/, '%')

【讨论】:

  • 谢谢汤姆! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多