1. 程式人生 > >gem "ransack"(4000✨) 簡單介紹

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