raymond

Gives your view tables nice sorting ability with ease.

Usage

Prepare your model: specify, which columns may get sorted.

class VeryImportantData < ActiveRecord::Base

include Raymond::Model

# sort by these db table columns
allow_sort_by :name, :created_at

# sort by this method, that is _not_ a db table column
allow_sort_by :my_custom_method, :db => false

# do a very customized sort
allow_sort_by :my_sort_key, :method => Proc.new{|obj| obj.my_method(:my_param)}

...

Not very much to do in the Controller:

class VeryImportantDataController < ApplicationController

def index
  # create the sorting object and pass the sorting parameters
  @sorting = Raymond::Control.new(self, params[:sort])

  # fetch the ordered result from the db; do method based sorting if necessary.
  @very_important_data = @sorting.result

  respond_to do |format|
    format.html # index.html.erb
  end
end

...

Use a helper method in your view to show the table headers:

<%= sort_header :name, 'Name' %> <%= sort_header :my_custom_method, 'Column #2' %> <%= sort_header :my_sort_key, 'Column #3' %> <%= sort_header :created_at, 'Since' %>

And the helper method (not included in Gem):

def sort_header(key, label)
current = @sorting.current_attr?(key)
symbol = current ? (@sorting.dir == :up ? '▲' : '▼') : ''
link_to "#{symbol}#{label}", "?sort=#{key}-#{current ? @sorting.inverse_dir : Raymond::DEFAULT_SORTING_DIR.to_s}"
end

More Customization

@sorting = Raymond::Control.new(self, params[:sort])

In the example above, the class to query it determined by the name of the controller applying Ruby on Rails conventions (PeopleController will use the class Person). Passing the option :class will allow you to use any other class:

@sorting = Raymond::Control.new(self, params[:sort], :class => PlzUseThisClass)

Often, you may want more control of the underlying SQL statement. Thanks to Arel, anything is possible:

@comments = @sorting.result do |active_relation|
active_relation.where(:deleted => false).limit(20)
end

What's next?

There's more to come, this is only version 0.0.1.

Copyright (c) 2010 Christoph Petschnig. See LICENSE for details.