Пошук за темою «Пошук» у Rails завершується тут…

Додайте функцію пошуку та сортування у вашій Rails програмі легко за допомогою ‘Ransack’

Ransack — це гем для Ruby on Rails, який надає просту та потужну систему пошуку для пошуку та фільтрації записів. Він дозволяє створювати складні запити для пошуку з кількома умовами, сортуванням та пагінацією.

Навіщо морочитись?..

Майже кожна програма сьогодні надає функцію пошуку, і написати прості запити для пошуку — це не складно. Але Ransack пропонує розширені можливості пошуку та фільтрації для вашої програми.

Він підтримує багато типів запитів, таких як «починається з», «закінчується на», «містить» та кілька умов, таких як «AND» та «OR». Крім того, Ransack інтегрується з ActiveRecord Rails, що дозволяє легко шукати та фільтрувати записи в базі даних. Він надає API для створення запитів пошуку, а також простий інтерфейс для генерації форм пошуку.

Гаразд, досить хвалити Ransack, давайте подивимось, як це насправді працює..

Візьмемо приклад додавання функції вільного текстового пошуку за ім’ям у список Products.

  1. Просто додайте гем у ваш файл gem та запустіть bundle
gem 'ransack'  

bundle install

2. Створіть базову форму для пошуку

<%= search_form_for @search do |f| %>  
 <%= f.label :name_cont %>  
 <%= f.text_field :name_cont %>  
<%= f.submit %>  
<% end %>

3. Додайте дію до контролера

def index  
 @search = Product.ransack(params[:q])  
 @products = @search.result  
end

4. Виведення результату

<% @products.each do |product| %>   
 <%= product.name %>  
 <%= product.description %>  
 <%= product.created_at %>  
<% end %>

Давайте зрозуміємо, що відбувається!

Форма пошуку створюється за допомогою методу-хелпера search_form_for. Він приймає об’єкт пошуку Ransack як аргумент, і в межах форми ми можемо додавати поля введення для умов пошуку. У цьому прикладі ми додаємо одне текстове поле для пошуку за атрибутом name моделі Product.

name_cont шукає в назві, що містить задані значення. Ransack надає різні пошукові матчі типу ‘_cont’ для більш складного пошуку.

Хммм, як це працює?!

Припустимо, ми ввели в поле пошуку слово happy. Насправді буде виконано наступний запит:

SELECT "products".* FROM "products" WHERE ("products"."name" ILIKE '%happy%')

Для більш детальної інформації про те, як це працює, ознайомтесь з демо додатком від Ransack для простих та розширених форм пошуку.

Якщо ви не знаєте, що таке ILIKE, це насправді версія SQL оператора LIKE, що не чутлива до регістру, і використовується для пошуку шаблонів у запитах до бази даних.

Хоча оператор ILIKE не є стандартним SQL оператором, і він специфічний для деяких систем управління реляційними базами даних, таких як PostgreSQL.

Ось і все для основ Ransack.

Більше функцій…

Сортування:

Ми також можемо сортувати та фільтрувати за допомогою Ransack. Для додавання сортування додайте наступний код до дії контролера:

@search = Product.ransack(params[:q])   
@search.sorts = [‘name asc’, ‘created_at desc’] if @search.sorts.empty?  
@products = @search.result.paginate(page: params[:page], per_page: 20)

А в уявленні додайте:

<%= sort_link(@search, :name) %>   
Description  
<%= sort_link(@search, :created_at) %>

Дозволені Ransackables:

За замовчуванням пошук та сортування дозволені для будь-якої колонки вашої моделі, і жодні методи класу/сфери не внесені в білий список.
Але ви можете визначити ransackable_attributes та ransackable_associations для селективної авторизації.

Просто додайте бажані ransackable_attributes в модель.

class Product < ActiveRecord::Base  
 def self.ransackable_attributes(auth_object = nil)  
 if auth_object == :admin  
 # додати всі атрибути в білий список для адміністратора  
 super  
 else  
 # додати в білий список лише атрибути name для інших користувачів  
 super & %w(name)  
 end  
 end  

private_class_method :ransackable_attributes  
end

Поліморфний пошук:

Під час пошуку в поліморфних асоціаціях, ми маємо вказати тип моделі, яку ми шукаємо.

class House < ActiveRecord::Base  
 has_one :location, as: :locatable  
end
class Location < ActiveRecord::Base  
 belongs_to :locatable, polymorphic: true  
end

Щоб здійснити пошук локацій за номером будинку, коли зв’язок є поліморфним, потрібно вказати тип записів, які ви шукаєте, і побудувати ваш запит наступним чином:

Location.ransack(locatable_of_House_type_number_eq: 100).result

Зверніть увагу на додавання _of_House_type_ до ключа пошуку. Це дозволяє Ransack правильно вказувати імена таблиць у SQL запитах для з’єднання.

Ось і все, це огляд Ransack. Ознайомтесь з детальною документацією Ransack тут для отримання додаткової інформації.

Перекладено з: The search for ‘Searching’ in rails ends here…