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

gem "ransack"(4000?) 簡單介紹

cti 介紹 rail ray 2.0 creation www xxx record

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?) 簡單介紹