【发布时间】: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范围,该范围位于title和locality -
你看过生成的SQL了吗? (它是什么?)这个 SQL 是否匹配记录? (如果没有,为什么不呢?)
-
查看 SQL 的最简单方法可能是查看
logs/development.log。 -
@TomLord 我用 SQL 日志编辑我的帖子
标签: ruby-on-rails ruby filterrific