Використання Ransack як пошукової системи

Налаштування

Додайте до вашого Gemfile:

  • gem "ransack"
  • Версія з GitHub: gem "ransack", github: "activerecord-hackery/ransack"
  • Потім bundle

Для цього прикладу я буду шукати Користувачів за username.

Отже, у моєму users_controller.rb я можу зробити так у моєму index екшні:

def index  
 @q = User.ransack(params[:q])  
 @users = [@q](http://twitter.com/q).result(distinct: true)  
end

@q — це параметри пошуку, які використовує ransack у своїй формі.

У моєму users/index.html.erb я маю налаштувати форму ось так:

<%= search_form_for [@q](http://twitter.com/q) do |f| %># Пошук, якщо поле username містить...  
 <%= f.label :username_cont %>  
 <%= f.search_field :username_cont %><%= f.submit %>

Закінчення _cont у пошуковому полі вказує, що ми шукаємо, чи містить username будь-яку групу символів, яку ми вводимо. Ви також можете вказати пошук, якщо username починається з символів, які ми шукаємо, використовуючи закінчення _start.

Далі, щоб відобразити ці результати пошуку, я можу написати щось на зразок цього на тій самій сторінці.

<% @users.each do |user| %>  
 <%= user.username %>  
<% end %>

Перемикачі

Якщо ви хочете використовувати перемикач для асоціації, множина має значення при визначенні полів введення. Припустимо, для цього прикладу, що у User є багато photos.

    <% Photo.all.each do |photo| %>        
        <%= check_box_tag('q[photos_id_eq_any][]', photo.id, (true if [@q](http://twitter.com/q).photos_id_eq_any.try(:include?, photo.id))) %>    
    <%= photo.id %>        
    <% end %>    

Це створить перемикач для кожної фотографії з її ID як мітка і значення перемикача. Для використання перемикача для стовпця у вашій таблиці ви можете зробити щось на зразок цього:

    <% [@users](http://twitter.com/users).each do |user| %>        
        <%= check_box_tag('q[username_eq_any][]', user.username, (true if [@q](http://twitter.com/q).username_eq_any.try(:include?, user.username))) %>    
    <%= user.username %>        
    <% end %>    

pic
Ви повинні використовувати змінну екземпляра, яку ви визначили у вашому контролері (у цьому випадку це @users), якщо ви хочете фільтрувати за стовпцем, а не за асоціацією.

Унікальні та відмінні результати

@users = User.all    
@q = User.ransack(params[:q])   
@people = [@q](http://twitter.com/q).result.group('users.username') 

Навіть якщо є два користувачі з однаковим іменем, з'явиться лише один. Ось такі базові моменти~

Перекладено з: Using Ransack as a Search Engine