Статьи

Сортировка таблиц в Rails с Mongoid

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

Есть несколько проблем с этим.

  1. Мы только что включили внедрение параметров, где можно отправлять все виды замечательных запросов в модель Mongoid, редактируя URL.
  2. Там нет четкой сортировки по умолчанию, для тегов мы хотели бы отсортировать по количеству в порядке убывания.

 
Первая проблема может быть решена путем проверки того, является ли направление одним из : 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