gem "ransack"(4000✨) 簡單介紹
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 語法來做搜尋,雖然用起來方便,但它會逐筆檢查資料是否符合,而不會使用資料庫的索引。如果資料量非常多有上萬筆以上,搜尋效能就會不滿足我們的需要。這時候會改安裝專門的全文搜尋引擎,例如
之前的部落格(全棧)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%')