12/08/2018, 14:15

Sử dụng ransack để search trong rails

Chúng ta có một số bất cập khi tự create 1 method search cho App rails. Vậy muốn xử lý search được đơn giản hơn ta nên dùng gem ransack. Bài viết này sẽ nói về cách dùng gem 'ransack' để search trong index: I. Cài đặt Ransack khả dụng với Rails 3.x, 4.0, 4.1 và 4.2. Thêm dòng sau vào ...

Chúng ta có một số bất cập khi tự create 1 method search cho App rails. Vậy muốn xử lý search được đơn giản hơn ta nên dùng gem ransack.

Bài viết này sẽ nói về cách dùng gem 'ransack' để search trong index:

I. Cài đặt

Ransack khả dụng với Rails 3.x, 4.0, 4.1 và 4.2.

Thêm dòng sau vào Gemfile:

gem "ransack”

II. Cách dùng:

Ransack có thể sử dụng với 1 trong 2 chế độ: đơn giản hoặc phức tạp.

In controller:

def index
    # cái này dùng để search
    @q = Person.ransack(params[:q])
    # cái này dùng để sort
    @search.sorts = 'name asc' if @search.sorts.empty?

    #kết quả
    @person = @q.result(distinct: true)
end

Note: Bạn có thể dùng phân trang hoặc nối nhiều bảng (relationship)

def index
     # cái này dùng để search
    @q = Person.ransack(params[:q])

     # cái này dùng để sort
     @search.sorts = ['name asc', 'created_at desc'] if @search.sorts.empty?

    #kết quả
    @people = @q.result.includes(:articles).page(params[:page])

    # or use `to_a.uniq` to remove duplicates (can also be done in the view):
    @people = @q.result.includes(:articles).page(params[:page]).to_a.uniq
end

In View

Ransack hổ trợ view với 2 thuộc tính chính: search_form_for và sort_link.

Note: Có 1 số options như: lteq (so sánh <=), gteq (so sánh >=), eq (so sánh =), lt (<), gt (>), in, cont (like %a%), present, null .... Bạn có thể xem chi tiết về những options trên ở đây: https://github.com/activerecord-hackery/ransack/wiki/Basic-Searching .

1.View search_form_for:

<%= search_form_for @q do |f| %>

  # tìm kiếm like %abc%
  <%= f.label :name_cont %>
  <%= f.search_field :name_cont %>

  # Tìm kiếm với những bảng liên quan (relationship)
  <%= f.label :articles_title_start %>
  <%= f.search_field :articles_title_start %>

  # Tìm kiếm nhiều field
  <%= f.label :name_or_description_or_email_or_articles_title_cont %>
  <%= f.search_field :name_or_description_or_email_or_articles_title_cont %>

  <%= f.submit %>
<% end %>

Note: Có 1 số options như: lteq (so sánh <=), gteq (so sánh >=), eq (so sánh =), lt (<), gt (>), in, cont (like %a%), present, null .... Bạn có thể xem chi tiết về những options trên ở đây: https://github.com/activerecord-hackery/ransack/wiki/Basic-Searching .

2.View Sort:

<%= sort_link(@q, :name) %>

#set sort mặc định
<%= sort_link(@q, :name, 'Last Name', default_order: :desc) %>

#multi sort
<%= sort_link(@q, :last_name, [:last_name, 'first_name asc'], 'Last Name') %>

Kết luận

Ransack thực sự là một công cụ hỗ trợ tìm kiếm đơn giản và dễ dàng trong thư viện gem của Ruby on the Rails.

0