will_paginate排序 - 一些列默认ASC,一些DESC

时间:2011-06-29 04:17:16

标签: ruby-on-rails ruby-on-rails-3 will-paginate

我在控制器中有以下内容以启用will_paginate排序:

def sort_column
  ['name', 'scheduled', 'status'].include?(params[:sort]) ? params[:sort] : "scheduled"
end
def sort_direction
  %w[asc desc].include?(params[:direction]) ? params[:direction] : "desc"
end

这些由表格列顶部的<%= sortable "status", "Status" %>补充 - 点击此列将对表格进行排序。

如何将某些列默认为ASC,而某些列默认为DESC?

原理

基于文本的列在ASC排序下运行良好。但是,如果我有百分比或数字的列,有时我想显示最佳/最高的第一,而不是要求用户单击两次以按照他们想要的方式对列进行排序。

2 个答案:

答案 0 :(得分:1)

使用默认排序定义哈希,从那里抓取未设置的排序:

def sort_direction
  sort_defaults = { 'name' => 'asc', 'age' => 'desc', 'scheduled' => 'asc' }
  sort_defaults.has_value?(params[:direction]) ? params[:direction] : sort_defaults[sort_column]
end

答案 1 :(得分:0)

想出来了!

这是来自Railscast#228和#240的原始application_helper.rb代码。

def sortable(column, title = nil)
  title ||= column.titleize
  css_class = column == sort_column ? "current #{sort_direction}" : nil
  if direction == "desc"
    direction = column == sort_column && sort_direction == "desc" ? "asc" : "desc"
  else
    direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"
  end
  link_to title, params.merge(:sort => column, :direction => direction, :page => nil), {:class => css_class}
end

我将其更改为(第1行和第4行的更改):

def sortable(column, title = nil, direction = nil)
  title ||= column.titleize
  css_class = column == sort_column ? "current #{sort_direction}" : nil
  direction ||= column == sort_column && sort_direction == "asc" ? "desc" : "asc"
  link_to title, params.merge(:sort => column, :direction => direction, :page => nil), {:class => css_class}
end

这使我现在可以在列标题中指定默认方向:

<div class="col> 
  <%= sortable "priority_number", "Priority", "desc" %> 
</div>