Налаштування
Додайте до вашого 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 %>
Ви повинні використовувати змінну екземпляра, яку ви визначили у вашому контролері (у цьому випадку це @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