Ceci est une ancienne révision du document !
Table des matières
Trier un tableau complexe
View
<table class="table table-sm table-striped my-2" id="table"> <thead class="text-dark"> <tr> <th class="col-sm align-top" scope="col"><%= sortable "name", t('batch.index.title.batch') %></th> <th class="col-sm align-top" scope="col"><%= sortable "tank", t('batch.index.title.tank') %></th> <th class="col-sm align-top" scope="col"><%= sortable "genotype", t('batch.index.title.genotype') %></th> <th class="col-sm align-top" scope="col"><%= sortable "species", t('batch.index.title.species') %></th> <th class="col-sm align-top" scope="col"><%= sortable "birth_date", t('batch.index.title.age') %></th> <th class="col-sm align-top" scope="col"><%= sortable "generation", t('batch.index.title.generation') %></th> <th class="col-sm align-top text-break" scope="col"><%= sortable "nb_male", t('batch.index.title.males') %></th> <th class="col-sm align-top text-break" scope="col"><%= sortable "nb_female", t('batch.index.title.females') %></th> <th class="col-sm align-top text-break" scope="col"><%= t('batch.index.title.individues') %></th> <th class="col-sm align-top" scope="col"><%= sortable "genetic_background", t('batch.index.title.genetic') %></th> <th class="col-sm align-top" scope="col"><%= sortable "user", t('batch.index.title.user') %></th> <th class="col-sm align-top" scope="col"><%= sortable "updated_at", t('batch.index.title.lastedit') %></th> <th class="col-sm align-top" scope="col"><%= sortable "exit_reason", t('batch.index.title.exit') %></th> <th class="col-sm align-top" scope="col"><%= t('batch.index.title.sanitary') %></th> <th class="col-sm align-top text-end" scope="col"><%= t('batch.index.actions') %></th> </tr> </thead>
Helper
module ApplicationHelper def sortable(column, title = nil) title ||= column.titleize css_class = if column != 'age' column == sort_column ? "current #{sort_direction} text-dark" : 'sort text-dark' else column == sort_column ? "current #{reverse_order(sort_direction)} text-dark" : 'sort text-dark' end direction = column == sort_column && sort_direction == 'asc' ? 'desc' : 'asc' link_to title, { sort: column, direction: direction }, { class: css_class } end end
Controller
class BatchesController < ApplicationController before_action :check_profile before_action :set_batch, only: %i[show edit update destroy archive versions version revert] before_action :set_version, only: %i[version revert] before_action :check_manager, only: %i[destroy archive archives versions version revert] helper_method :sort_column, :sort_direction NB_ITEMS = ENV['ITEM_PER_PAGE']&.to_i || 25 ALLOWED_SORTS = %w[name tank genotype species birth_date generation nb_male nb_female genetic_background user updated_at exit_reason].freeze COLNAME = { 'genotype': 'genotypes.name', 'tank': 'tanks.rfid', 'species': 'species.name', 'user': 'users.uid' }.freeze def index @page = params.fetch(:page, 1).to_i @max_page = (Batch.count.to_f / NB_ITEMS).ceil @batches = Batch.where(is_archived: false) .includes(:species, :genotype, :tanks, { user: [:profile] }) .order("#{request_colname} #{sort_direction}") .offset((@page - 1) * NB_ITEMS) .limit(NB_ITEMS) end def request_colname if %w[asc desc].include?(params[:direction]) COLNAME.include?(params[:sort].to_sym) ? COLNAME[params[:sort].to_sym] : params[:sort] else 'updated_at' end end def sort_column %w[asc desc].include?(params[:direction]) ? params[:sort] : 'updated_at' end def sort_direction ALLOWED_SORTS.include?(params[:sort]) ? params[:direction] : 'desc' end end