Sorting an ActiveRecord hash

I've got a query like the following:

@tags = Tag.find(:all, :limit => 20, :conditions => "id != 22 and id != 47" , :order => "count DESC")

My understanding is the ActiveRecord returns an array of hash objects to @tags. so @tags is actually an array full of hashes.

No! Look for yourself by looking at @tags, e.g. by executing the query in script/console.

How can I then sort @tags by the 'name' field so I will have the top 20 tags sorted by alpha name?

Arguably, tags have a natural ordering by name, therefore it makes sense for Tag to implement <=>

class Tag   def <=>(other)     self.name <=> other.name   end end

Then you can just call @tags.sort! and the supplied operator is used. For good measure you should make Tag Comparable to get a few more methods for free

class Tag   include Comparable # provides <, <=, ==, >=, >, between?   def <=>(other)     self.name <=> other.name   end end

Even better, push back the query into your Tag model class. Thus,

@tags = Tag.find(:all, :limit => 20, :conditions => "id != 22 and id != 47" , :order => "count DESC")

becomes

class Tag   def Tag.find_top_20(*excluded_ids)     exclude_ids_condition = excluded_ids.empty? ?       nil :       ['id NOT IN (?)', excluded_ids]     tags = Tag.find(:all,       :limit => 20,       :conditions => exclude_ids_condition,       :order => 'count DESC')     tags.sort!   end end

Presumably the excluded ids have some meaning and you really shouldn't carry them around by hand. Very probably, what you're trying to do belongs as an extension on an association -- have a good look at the docs for associations.

Michael