git: https://github.com/activerecord-hackery/ransack
Gorails视频和我的博客记录:https://www.cnblogs.com/chentianwei/p/9822492.html
全栈课上有这个gem的介绍:https://www.cnblogs.com/chentianwei/p/9438461.html
ransack 会用数据库的 LIKE 语法来做搜寻,虽然用起来方便,但它会逐笔检查资料是否符合,而不会使用数据库的索引。如果数据量非常多有上万笔以上,搜寻效能就会不满足我们的需要。这时候会改安装专门的全文搜寻引擎,例如 Elasticsearch,这是大数据等级的。
之前的博客(全栈)https://www.cnblogs.com/chentianwei/p/9438461.html
Gem "Ransack"
Ransack enables the creation of both simple and advanced search forms for your Ruby on Rails application。
Ransack不是在model层和controller层的简化搜索.
Ransack用于创建搜索表格form.
A form is a paper with questions on it and spaces marked where you should write the answers. A table is a written set of facts and figures arranged in columns and rows.
Controller
def index
@q = Person.ransack(params[:q])
@people = @q.result(distinct: true)
end #如果在一个关联的table的column上进行sorting. 不使用distinct: true #下面的例子将预加载preloadingPerson's Articles表格,并使用pagination gem插件。所以去掉distinct: true选项 def index
@q = Person.ransack(params[:q])
@people = @q.result.includes(:articles).page(params[:page]) #可以附加to_a.uniq,把relation对象转化为Array,使用uniq方法去掉重复记录。
end
View
定义了2个helper
- search_form_for: 取代form_for用于创建view的 search form
- sort_link:给table headers添加上可sortable links。
具体用法:
看演示 http://ransack-demo.herokuapp.com
search_form_for
<%= search_form_for @q do |f| %>
# name是User的column
<%= f.label :name_cont %>
<%= f.search_field :name_cont%> # 如果搜索关联表格Article的column: 用articles_title_start
<%= f.label :articles_title_start %>
<%= f.search_field :articles_title_start %> #属性可以链接到一起进行查询,例如User有2个相关columns: first_name和last_name
<%= f.label :first_name_or_last_name_cont %>
<%= f.text_field :first_name_or_last_name_cont%>
<% end %>
解释:
f.search_field的参数的格式:
attribute_name[_or_attribute_name]..._predicate #如first_name_or_last_name_cont
search predicate:搜索谓语
在Ransack搜索中, Predicates用于决定匹配什么信息。
详细的小例子:https://github.com/activerecord-hackery/ransack/wiki/Basic-Searching
例子:
cont(contains) :用于检查一个属性中是否包括一个值。
使用Like "%xxx%"语法。
>> User.ransack(first_name_cont: 'Rya').result.to_sql
=> SELECT "users".* FROM "users" WHERE ("users"."first_name" LIKE '%Rya%')
start(start_with)
LIKE "%xx" 开头是xxx, 类似正则表达式/^xxx/
>> User.ransack(first_name_start: 'Rya').result.to_sql
=> SELECT "users".* FROM "users" WHERE ("users"."first_name" LIKE 'Rya%')