Сортировка таблиц в Rails является распространенной проблемой. Должно быть, это было сделано раньше, верно? На самом деле это было сделано так много раз, что действительно трудно найти что-то, что «просто работает». Оказалось, что тратить много времени, по крайней мере, на двух человек с творческими библиотеками не хватает во многих довольно тривиальных направлениях. Из хороших, коллега попробовал sortable_table , но он не поддерживается, и мы, наконец, остановились на гораздо лучших handles_sortable_columns , которые потребовали небольшую интеграционную работу для Mongoid.
Давайте заставим все наши контроллеры поддерживать сортировку с параметром sort_by . Добавьте следующее в ваш ApplicationController .
handles_sortable_columns do |conf|
conf.sort_param = "sort_by"
end
Это позволяет нам добавлять сортировку столбцов с помощью sortable_column к представлению ( views / tags / index.html.haml ).
#tags
%table
%tr
%th= sortable_column "Name"
%th= sortable_column "Count"
- @tags.each do |tag|
%tr
%td.name= link_to h(tag.name), edit_tag_path(tag)
%td= tag.count
Мы можем использовать сортировку по монгоидальной модели напрямую. Для модели Tag это означает вызов Tag.desc (: поле) или Tag.asc (: поле) по имени.
sortable_column_order do |column, direction|
tags = Tag.send(direction, column)
end
Есть несколько проблем с этим.
- Мы только что включили внедрение параметров, где можно отправлять все виды замечательных запросов в модель Mongoid, редактируя URL.
- Там нет четкой сортировки по умолчанию, для тегов мы хотели бы отсортировать по количеству в порядке убывания.
Первая проблема может быть решена путем проверки того, является ли направление одним из : asc или : desc и является ли столбец полем в модели (добавлено в config / initializers / mongoid_document.rb ).
module Mongoid
module Document
module ClassMethods
def sort_by(sort_column, sort_direction)
return nil unless ! sort_direction.blank? and [ :asc, :desc ].include?(sort_direction)
return nil unless ! sort_column.blank? and self.fields.has_key?(sort_column.to_s)
return self.send(sort_direction, sort_column)
end
end
end
end
Поскольку sort_by_column возвращает nil, если сортировка не была выполнена, мы можем использовать ее для введения сортировки по умолчанию в контроллере Tags .
class TagsController < ApplicationController
def index
sortable_column_order do |column, direction|
@tags = Tag.sort_by(column, direction)
end
@tags ||= Tag.desc(:count)
...
end
...
end
Скриншоты
Мне нравится внимание к деталям с маленькой стрелкой рядом с отсортированным столбцом, а также тот факт, что этот драгоценный камень использует синтаксис –column для сортировки по убыванию. Это также правильно поддерживает нумерацию страниц. Отлично сработано.
драгоценный камень
Источник: http://code.dblock.org/sorting-tables-in-rails-w-mongoid