Сортировка таблиц в 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