Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Orderable
- def self.included(mod)
- class << mod
- include Orderable::ClassMethods
- end
- mod.class_eval do
- # orderable scope takes an array of sorts of the form [(key | [key, dir])*]
- # and sorts the collection by the given keys
- scope :orderable, lambda{|orders|
- self.order(self.orders_string(orders)) if !orders.blank?
- }
- end
- end
- module ClassMethods
- def order_by(*cols)
- cols.each{|col| orderable_by << col.to_s}
- end
- def orderable_by
- @orderable_by ||= []
- end
- def order_string(col, dir)
- col.to_s + (( dir && dir.to_s =~ /^d(?:esc)?$/i ) ? " desc" : "")
- end
- def selected_orders(orders)
- if orders
- orders.split(%r{ |\+}).
- map{|order| order.split("/") if order }.
- reject{|col,dir| !orderable_by.include?(col.to_s)}
- else
- []
- end
- end
- def orders_string(orders)
- selected_orders(orders).
- map{|(col,dir)| order_string(col,dir)}.join(",")
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement