简述Ransack

一. Ransack 是什么?

Ransack是rails中用来做搜索的一个gem。

二. Ransack 怎么用?

1
2
3
4
5
#controller document
class TblAccountsController < ApplicationController
@q = TblAccount.ransack([:q])
@player = TblAccount.result(distinct: true)
end
1
2
3
4
5
# views document
<% search_form_for @q do |f| %>
<%= f.search_field :account_cont %>
<%= submit_tag "搜索", class: "btn" %>
<% end %>

这里只是简单的用法介绍,另外还有高级用法,这里不再赘述,具体用法可以参见https://github.com/activerecord-hackery/ransack/blob/master/README.md

三. Ransack 原理

Ransack用来做模糊(LIKE)查询。当我们使用Ransack进行查询时,它会通过Active Record 执行sql语句,去搜索并且返回与输入字符相匹配的结果,查询日志代码如下:

1
SELECT  `tbl_account`.* FROM `tbl_account` WHERE (`tbl_account`.`account` LIKE '%玩家%' LIKE '%joe%')

这样会查询中带有“joe”关键字的所有用户,我们可以直接将rails查询语句转化为sql语句,来弄清ransack查询的真相。

1
2
3
4
5
6
 >> TblAccount.ransack(account_cont: "jonathan").result.to_sql # account为tbl_account这张表中的一个字段。
=> SELECT `tbl_account`.* FROM `tbl_account` WHERE (`tbl_account`.`account` LIKE 'jonathan')

相当于
>> TblAccount.where("account like ?", "%jonathan%")
=> SELECT `tbl_account`.* FROM `tbl_account` WHERE (account like 'jonathan')

PS: 关于ransack中的cont以及其他搜索条件介绍,请参考这篇文章