Skip to content

Instantly share code, notes, and snippets.

@kblake
Created October 26, 2009 01:20
Show Gist options
  • Save kblake/218362 to your computer and use it in GitHub Desktop.
Save kblake/218362 to your computer and use it in GitHub Desktop.
module AttributesSort
def self.included(receiver)
Array.class_eval do
def do_sort(options = {})
type = self.first.class
type.instance_eval do
def do_attributes_sort(collection, options={})
attributes = options[:sort_by].inject("["){|attribute_string, attribute| attribute_string << "object.#{attribute},"} + "]"
collection.sort_by{|object| eval(attributes)}
end
end
type.do_attributes_sort(self, options)
end
end
end
end
class Person
include AttributesSort
attr_accessor :firstname,:lastname,:age
def initialize(firstname,lastname,age=0)
@firstname = firstname
@lastname = lastname
@age = age
end
def name
"#{@firstname} #{@lastname}"
end
def to_s
"Hello my name is #{name} and my age is #{@age}"
end
end
people = [Person.new("joe","blow",12),Person.new("joe","blow",89),Person.new("mary","watson",32),Person.new("annie","watson",9),Person.new("bob","builder",12)]
p people.do_sort(:sort_by=>[:lastname])
puts
p people.do_sort(:sort_by=>[:age])
puts
p people.do_sort(:sort_by=>[:lastname,:firstname,:age])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment