gem "ransack"(4000✨) 简单介绍

Object-based searching:演示。

git:  https://github.com/activerecord-hackery/ransack

Gorails视频和我的博客记录:https://www.cnblogs.com/chentianwei/p/9822492.html

对比类似的搜索gem 'searchkich'

全栈课上有这个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用于决定匹配什么信息。

查看:Ransack定义的全部predicate

详细的小例子: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%')

原文地址:https://www.cnblogs.com/chentianwei/p/9999326.html