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%‘)
gem "ransack"(4000?) 簡單介紹