diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2015-02-05 14:20:55 -0800 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2015-02-05 14:20:55 -0800 |
commit | 62ed1c537e9b8aa85d354b377f18083fb71b8e05 (patch) | |
tree | a1b75f804b2e9384190f9d591a2f2701ea8d31db /app/models/concerns/sortable.rb | |
parent | dbca8c97588d1fcc4155b079eb54157991be3aa7 (diff) | |
download | gitlab-ce-62ed1c537e9b8aa85d354b377f18083fb71b8e05.tar.gz |
Explicitly define ordering in models using default_scope
Diffstat (limited to 'app/models/concerns/sortable.rb')
-rw-r--r-- | app/models/concerns/sortable.rb | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb new file mode 100644 index 00000000000..49001cabc7c --- /dev/null +++ b/app/models/concerns/sortable.rb @@ -0,0 +1,32 @@ +# == Sortable concern +# +# Set default scope for ordering objects +# +module Sortable + extend ActiveSupport::Concern + + included do + # By default all models should be ordered + # by created_at field starting from newest + default_scope { order(created_at: :desc, id: :desc) } + scope :order_name, -> { reorder(name: :asc) } + scope :order_recent, -> { reorder(created_at: :desc, id: :desc) } + scope :order_oldest, -> { reorder(created_at: :asc, id: :asc) } + scope :order_recent_updated, -> { reorder(updated_at: :desc, id: :desc) } + scope :order_oldest_updated, -> { reorder(updated_at: :asc, id: :asc) } + end + + module ClassMethods + def sort(method) + case method.to_s + when 'name' then order_name_asc + when 'recent' then order_recent + when 'oldest' then order_oldest + when 'recent_updated' then order_recent_updated + when 'oldest_updated' then order_oldest_updated + else + self + end + end + end +end |