Sortable Columns Across Tables

If you follow Railscast 228 you get sortable table columns for your model. But what if you don’t want to expose the name of the actual database columns or more interesting if you want to sort across tables? Here is how I do it.

In your controller add order or reorder if you already have an order clause in one of the used scopes (default_scope counts too).

class AttendeesController < ApplicationController
  def index
    @attendances = @conference.attendances.reorder(sort_query).page(params[:page])
  end

  # ...
end

As I’m using this mechanism in different controllers I added the common functionality to the application_controller.rb file.

class ApplicationController < ActionController::Base
  helper_method :navigation_params, :sort_column, :sort_direction

  protected

  # supports only attendances for now
  ALLOWED_SORT_COLUMNS = {
    "fee_payed" => "fee_payed",
    "fee_payed_on" => "fee_payed_on",
    "name" => "users.last_name, users.first_name",
    "payment_confirmation_sent_at" => "payment_confirmation_sent_at",
    "registered_at" => "registered_at",
    "registration_confirmation_sent_at" => "registration_confirmation_sent_at",
    "town" => "users.town"
  }

  # use this in views
  def sort_column
    ALLOWED_SORT_COLUMNS.keys.include?(params[:sort]) ? params[:sort] : "name"
  end

  def sort_direction
    %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
  end

  def navigation_params
    { direction: params[:direction], page: params[:page],  sort: params[:sort] }
  end

  def sort_query
    sort_query_column.split(',').map{ |column| column + ' ' + sort_direction }.join(', ')
  end

  # use this in controllers
  def sort_query_column
    ALLOWED_SORT_COLUMNS[sort_column]
  end
end

This will use the ALLOWED_SORT_COLUMNS hash to map between user visible and actual database sort columns. Adding sort_query also allows us to sort by multiple columns at once. navigation_params is a shortcut I use when generating URLs (e.g. in link_to) and I want to preserve pagination, sorting, filters/searches, etc. across pages.

  def link_to_sortable(column, title = nil)
    title ||= column.titleize
    sort_icon = column == sort_column ? content_tag(:i, nil, class: (sort_direction == "asc" ? "icon-chevron-down" : "icon-chevron-up")) : ""
    direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"
    link_to (title+" "+sort_icon).html_safe, params.merge(sort: column, direction: direction, page: nil)
  end

Note that sort_icon assumes you are using Bootstrap.

Now we can have sortable columns in our views:

<%= link_to_sortable "name" %>
...

Debugging SASL

If you are using Cyrus SASL with your Postfix you might feel the need to debug what SASL does in the background. But SASL does not log into /var/log/mail.*. 🙁

So after some research I fount a way …

/etc/init.d/saslauthd stop

Stop the SASL daemon and start it by hand:

saslauthd -d -a pam -r -c -m /var/spool/postfix/var/run/saslauthd

Consult the MECHANISMS and OPTIONS settings in /etc/defaults/saslauthd for which options to use in your case.
But the most important option is -d. It will run the daemon in the foreground and make it more verbose.

Now it will show you everything it does. 😀

Don’t forget to start the actual daemon once you are done debugging:

/etc/init.d/saslauthd start

John Nash’s Letter to the NSA

Interesting:

The National Security Agency (NSA) has recently declassified an amazing letter that John Nash sent to it in 1955.  It seems that around the year 1950 Nash tried to interest some US security organs (the NSA itself was only formally formed only in 1952) in an encryption machine of his design, but they did not seem to be interested.

and

All in all, the letter anticipates computational complexity theory by a decade and modern cryptography by two decades.  Not bad for someone whose “best known work is in game theory”.

 

Creepy Pregnancy Test

The NYT has a nice piece on how tracking your shopping habits allows marketing firms to determine if you are pregnant and how far along you are … even if you don’t know.

And there is a followup from Forbes.

Money Quote:

What Target discovered fairly quickly is that it creeped people out that the company knew about their pregnancies in advance.

“If we send someone a catalog and say, ‘Congratulations on your first child!’ and they’ve never told us they’re pregnant, that’s going to make some people uncomfortable,” Pole told me. “We are very conservative about compliance with all privacy laws. But even if you’re following the law, you can do things where people get queasy.” – NYT

– Forbes