ruby-on-rails - 我的 Filterrific 过滤器不起作用
问题描述
我尝试在我的应用程序上实现 Filterrific 以过滤用户。我需要按母语、位置和可用性 start_time 进行过滤。但它不起作用。没有错误,但没有过滤...
模型 user.rb :
filterrific(
default_filter_params: {},
available_filters: [
:search_query,
:search_query,
:with_start_time_gte
]
)
scope :search_query, lambda { |query|
return nil if query.blank?
terms = query.downcase.split(/\s+/)
terms = terms.map { |e|
(e.gsub('*', '%') + '%').gsub(/%+/, '%')
}
num_or_conditions = 2
where(
terms.map {
or_clauses = [
"LOWER(users.mother_tongue) LIKE ?",
"LOWER(users.locality) LIKE ?"
].join(' OR ')
"(#{ or_clauses })"
}.join(' AND '),
*terms.map { |e| [e] * num_or_conditions }.flatten
)
}
scope :with_start_time_gte, lambda { |ref_date|
where('availability.start_time >= ?', ref_date)
}
用户控制器.rb:
def index
@filterrific = initialize_filterrific(
User,
params[:filterrific]
#persistence_id: 'shared_key',
#default_filter_params: {},
#available_filters: [],
) or return
@users = @filterrific.find.page(params[:page])
# Respond to html for initial page load and to js for AJAX filter updates.
respond_to do |format|
format.html
format.js
end
rescue ActiveRecord::RecordNotFound => e
# There is an issue with the persisted param_set. Reset it.
puts "Had to reset filterrific params: #{ e.message }"
redirect_to(reset_filterrific_url(format: :html)) and return
end
index.html.erb :
<% provide(:title, 'Liste des utilisateurs') %>
<h1>Liste des utilisateurs :</h1>
<%= form_for_filterrific @filterrific, html: { id: 'filterrific-no-ajax-auto-submit' } do |f| %>
<div>
Langue :
<%= f.text_field(
:search_query,
class: 'mother_tongue filterrific-periodically-observed'
) %>
</div>
<div>
Ville :
<%= f.text_field(
:search_query,
class: 'locality filterrific-periodically-observed'
) %>
</div>
<div>
Date de départ :
<%= f.text_field(:with_start_time_gte, class: 'js-datepicker') %>
</div>
<%= f.submit 'Rechercher' %>
<div>
<%= link_to(
'Reset filters',
reset_filterrific_url,
) %>
</div>
<%= render_filterrific_spinner %>
_list.html.erb :
<div id="filterrific_results">
<div>
<%= page_entries_info users %>
</div>
<% @users.each do |user| %>
<h1><%= user.fname %> <%= user.lname %></h1>
<h2><%= user.mother_tongue %></h2>
<center>
<p><%= user.postal_code %> <%= user.locality %></p>
<p><%= link_to "En savoir plus", user_path(user) %></p>
</center>
<% end %>
我是新来的铁路,所以谢谢你的帮助。
解决方案
您使用的方法 ,用于scope :search_query...
在您指定的 2 个数据库列之一中查找输入文本,users.mother_tongue
并且users.locality
。事实上,结果 where 子句将是"WHERE LOWER(users.mother_tongue) LIKE ? OR LOWER(users.locality) LIKE ?"
.
如果要分别过滤 2 个字段的值,则必须定义 2 个具有不同名称的输入字段、2 个过滤器和 2 个范围。
代码可能是这样的:
模型 user.rb :
filterrific(
default_filter_params: {},
available_filters: [
:with_mother_tongue,
:with_locality,
:with_start_time_gte
]
)
scope :with_mother_tongue, -> (search_string) {
where("users.mother_tongue ILIKE ?", (search_string.to_s.gsub('*', '%') + '%').gsub(/%+/, '%'))
}
scope :with_locality, -> (search_string) {
where("users.locality ILIKE ?", (search_string.to_s.gsub('*', '%') + '%').gsub(/%+/, '%'))
}
scope :with_start_time_gte, lambda { |ref_date|
where('availability.start_time >= ?', ref_date)
}
在索引视图中,您还必须渲染 _list 部分(见最后):
index.html.erb:
<% provide(:title, 'Liste des utilisateurs') %>
<h1>Liste des utilisateurs :</h1>
<%= form_for_filterrific @filterrific, html: { id: 'filterrific-no-ajax-auto-submit' } do |f| %>
<div>
Langue :
<%= f.text_field(
:with_mother_tongue,
class: 'mother_tongue filterrific-periodically-observed'
) %>
</div>
<div>
Ville :
<%= f.text_field(
:with_locality,
class: 'locality filterrific-periodically-observed'
) %>
</div>
<div>
Date de départ :
<%= f.text_field(:with_start_time_gte, class: 'js-datepicker') %>
</div>
<%= f.submit 'Rechercher' %>
<div>
<%= link_to(
'Reset filters',
reset_filterrific_url,
) %>
</div>
<%= render_filterrific_spinner %>
#filterrific_results
= render 'users/list', users: @users
最后,当您过滤填充至少一个过滤器输入字段的记录时,您必须在控制器中定义由 index 操作调用的 js 视图:
index.js.erb
<% js = escape_javascript (
render(partial: 'users/list', locals: {users: @users})
) %>
$("#filterrific_results").html("<%= js %>");
推荐阅读
- python - Discord.py Bot 每次重启后都会发送一条额外的消息
- visual-c++ - IVssExamineWriterMetadata 的 C++ 和 COM 接口有什么区别?
- c++ - C++ 11:互斥量和条件变量不能被复制
- python - 让高优先级的python线程进入临界区,而低优先级的线程在临界区执行
- javascript - 如何使用 loadash/javascript 嵌套多个 groupby
- reactjs - 为什么我无法从另一台计算机访问我的 react 应用程序开发环境
- javascript - 如何强制在 Safari 而不是 webview 中打开链接?
- html - 有没有办法提供多种视频质量(分辨率)而不在 HTML5 视频播放器中上传多个视频?
- opengl - 我需要在片段着色器中进行输出伽玛校正吗?
- python - 如何修复海龟旋转中的溢出