Ransack

Ransack là một gem được viết lại từ gem MetaSearch được dùng để tìm kiếm dữ liệu.
Nó hỗ trợ nhiều tính năng tương tự như MetaSearch nhưng khác nhau khá nhiều so với
MetaSearch trong cách thức thực hiện tìm kiếm, và tính tương thích không phải là mục
tiêu thiết kế của nó.

Trước tiên các bạn sẽ cài đặt gem simple_form’

gem 'simple_form'

Cài đặt:

bundle install
rails generate simple_form:install

Các bạn có thể cài thêm Simple Form Bootstrap

rails generate simple_form:install --bootstrap

Cài đặt gem "ransack"

gem "ransack"

Khi sử dung gem "ransack" nó sẽ hổ trợ tìm kiếm, sắp xếp, …
Tìm kiếm theo
vd: name: name_cont, age_cont

  <%= f.text_field :name_cont, placeholder: "enter name", class: "form-control" %>
  <%= f.text_field :age_cont, placeholder: "enter age", class: "form-control" %>

Tìm kiếm theo nhiều trường
vd: name_or_age_or_email_cont

 <%= f.text_field :name_or_age_or_email_cont, placeholder: "enter name or age or email", class: "form-control" %>

Tìm kiếm theo mốc thời gian
vd: :created_at_gteq và created_at_ltor

<%= f.date_field :created_at_gteq, placeholder: create_from, class: "form-control" %>
<%= f.date_field :created_at_lteq, placeholder: "create to, class: "form-control" %>

Sắp xếp theo các trường:

<%= sort_link @search, :name,  t("name") %>

db

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :password
      t.string :email
      t.integer :age
      t.string :avatar

      t.timestamps
    end
  end
end

controller

def index
    @search = User.ransack params[:q]
    @uers = @search.result
  end

view

ruby

<%= search_form_for  @search, class: "col-md-12" do |f| %>
  <div class="form-group col-md-2">
    <%= f.text_field :name_cont,  placeholder: "enter name",  class: "form-control" %>
  </div>
  <div class="form-group col-md-2">
      <%= f.submit "search", class: "btn btn-primary" %>
  <ont
<% end %>
<table class="table table-hover">
  <thead>
    <tr>
      <th> <%= sort_link @search, :name,  t("name") %> </th>
      <th> <%= sort_link @search, :age, t("age") %> </th>
    </tr>
  </thead>
  <tbody>
    <% @users .each do |user| %>
    <tr>
      <td> <%= user.name %> </td>
      <td> <%=user.age %> </td>
    </tr>
    <% end %>
  </tbody>
</table>

Các bạn củng có thể viết 1 đoạn javascript để tìm kiếm :
Chỉ cần truyền id_form_search, vd: Search_ransack(‘#user_search’)

javascript

function Search_ransack(id_form_search){
  $(document).on('keyup', id_form_search, function() {
    $.get($(id_form_search).attr('action'),
      $(id_form_search).serialize(), null, 'script');
    return false;
  });
}

Tài liệu tam khảo: https://github.com/activerecord-hackery/ransack