Ransack — це гем для Rails, який використовується для створення розширених форм пошуку. Він простий у використанні. Хоча можна створювати користувацькі запити для пошуку в Rails, використання гему ransack спрощує запити, зменшуючи навантаження на розробника.
Я використовую ransack версії 2.3.2 та ajax-datatables-rails версії 0.4.3.
Додайте останню версію гему ransack у ваш Gemfile.
gem 'ransack'
bundle install
У контролері, articles_controller.html.erb
class ArticlesController < ApplicationController
def index
@q = Article.ransack(params[:q])
respond_to do |format|
format.html
format.json { render json: ArticleDatatable.new(view_context, {ca: current_admin}) }
end
end
end
У індексі статей, index.html.erb
<%= search_form_for [@q](http://twitter.com/q), :remote => true do |f| %>Автор
<%= f.select(:author_name_cont, options_for_select(Author.order(:name).collect{|t| [t.name, t.name]}, (params[:q].nil? ? '' : params[:q][:author_name_cont])),{:include_blank => true}, {class: "form-control select2"}) %>Назва
<%= f.text_field :title_cont, class: "form-control", value: params[:q].nil? ? '' : params[:q][:title_cont] %> Дата початку
<%= f.text_field :date_published_gteq, class: 'form-control', value: params[:q].nil? ? '' : params[:q][:date_published_gteq] %> Дата кінця
<%= f.text_field :date_published_lteq, class: 'form-control', value: params[:q].nil? ? '' : params[:q][:provider_expiry_lteq] %><%= f.submit "Пошук", class: "btn btn-success float-right ml-2"%><%= end %>
Автор Назва Дата публікації
Тут, в index файлі, потрібно передати params[:q], оскільки Rails не дозволяє передавати хеш як параметр, ми перетворюємо params[:q] на рядок.
class ArticleDatatable < AjaxDatatablesRails::Base
def view_columns
@view_columns ||= {
author: {source: "Author.name", cond: :like },
title: {source: "Article.title", cond: :like },
date_published: {source: "Article.date_published", cond: :like},
}
end
private
def data
records.map do |record|
{
author: record.author.name,
title: record.title,
date_published: record.date_published,
DT_RowId: record.id
}
end
end
def get_raw_records
if params[:q].nil?
@q = Article.select("articles.*, authors.id, authors.name")
.left_outer_joins(:author)
else
@q = Article.select("articles.*, authors.id, authors.name")
.left_outer_joins(:author).ransack(eval(params[:q].to_json)).result(distinct: true)
end
@articles = @q
end
end
У таблиці даних важливо зауважити, що ми використовуємо eval(params[:q].to_json), оскільки передаємо параметри як рядок з виду, і потрібно перетворити його назад на хеш. Інтеграція хешу в таблицю даних не потребує додаткових змін у JavaScript файлі. Я поділився файлом coffee-script для вашого ознайомлення. articles.coffee
# Datatables
$(document).on 'turbolinks:load', ->
table = $('#articles-table').dataTable
dom: 'C<"clear">lfrtip'
processing: true
serverSide: true
ajax: $('#articles-table').data('source')
pagingType: 'full_numbers'
columns: [
{data: 'author'}
{data: 'title'}
{data: 'date_published'}
]
Перекладено з: [Using Ransack with Ajax data tables in ruby on rails](https://medium.com/@emmanuvarghese/using-ransack-with-ajax-data-tables-in-ruby-on-rails-8b3464b58a65)