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%')


gem "ransack"(4000✨) 简单介绍的更多相关文章

  1. (GoRails)在导航栏增加自动的搜索功能(jquery插件:easyautocomplete)(gem 'ransack' 搜索对象4000✨)

    Global Autocomplete Search 需要用到一个JQuery插件和一个搜索对象的gem EasyAutocomplete jQuery插件: https://github.com/p ...

  2. 内核调试神器SystemTap — 简单介绍与使用(一)

    a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 简单介绍 SystemTap是我眼下所知的最强大的内核调试工具,有些家伙甚 ...

  3. CocoaPods的简单介绍及安装和使用

    CocoaPods的简单介绍及安装和使用   一.CocoaPods是什么? 当你开发iOS应用时,会常常使用到非常多第三方开源类库.比方JSONKit.AFNetWorking等等. 可能某个类库又 ...

  4. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  5. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  6. 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍

    一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...

  7. yii2的权限管理系统RBAC简单介绍

    这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...

  8. angular1.x的简单介绍(二)

    首先还是要强调一下DI,DI(Denpendency Injection)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...

  9. Linux的简单介绍和常用命令的介绍

    Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...

随机推荐

  1. 回归Android之Android基础和小常识

    Activity ,Service,Content Provider,BroadcastReceiver, Intent SQLite,Http,Fragement,Handle 1,Activity ...

  2. gcc,make,cmake

    1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C.C++.Objective-C.Fortran.Java等等 ...

  3. kubeadm 生成的token过期后,集群增加节点

    通过kubeadm初始化后,都会提供node加入的token: You should now deploy a pod network to the cluster. Run "kubect ...

  4. ZOJ 1602 Multiplication Puzzle(区间DP)题解

    题意:n个数字的串,每取出一个数字的代价为该数字和左右的乘积(1.n不能取),问最小代价 思路:dp[i][j]表示把i~j取到只剩 i.j 的最小代价. 代码: #include<set> ...

  5. 【做题】CF119D. String Transformation——KMP

    题意:有两个字符串\(a,b\),下标从\(0\)开始.求数对\((i,j)\)满足\(a[i+1:j] + r(a[j:n]) + r(a[0:i+1]) = b\),其中\(r(s)\)表示字符串 ...

  6. 【注册码】Matlab7.0(R14)注册码

    Matlab 7 (R14) 注册码1:14-13299-56369-16360-32789-51027-35530-39910-50517-56079-43171-43696-14148-64597 ...

  7. HDU 5844 LCM Walk(数学逆推)

    http://acm.hdu.edu.cn/showproblem.php?pid=5584 题意: 现在有坐标(x,y),设它们的最小公倍数为k,接下来可以移动到(x+k,y)或者(x,y+k).现 ...

  8. 每日质量NPM包-classnames

    一.classnames 现在到处都追求效率开发,所谓存在即合理,各种各样的开源包/项目火热,也是因为他们大大解决了之前复杂的逻辑.作为榜上前10的热门包:classnames.还真需要了解了解它才能 ...

  9. 删除node_modules文件

    删除node_modules文件夹报错:路径太长,无法删除. npm install rimraf -g rimraf node_modules

  10. Gson的fromJson()方法把json字符创转为实体

    直接上代码: 1.先看Person实体类 import lombok.Data; @Data public class Person { private String name; private in ...