]> git.openstreetmap.org Git - rails.git/blobdiff - app/controllers/concerns/pagination_methods.rb
Move common pagination code to mixin
[rails.git] / app / controllers / concerns / pagination_methods.rb
diff --git a/app/controllers/concerns/pagination_methods.rb b/app/controllers/concerns/pagination_methods.rb
new file mode 100644 (file)
index 0000000..58b5225
--- /dev/null
@@ -0,0 +1,27 @@
+module PaginationMethods
+  extend ActiveSupport::Concern
+
+  private
+
+  ##
+  # limit selected items to one page, get ids of first item before/after the page
+  def get_page_items(items, includes)
+    id_column = "#{items.table_name}.id"
+    page_items = if params[:before]
+                   items.where("#{id_column} < ?", params[:before]).order(:id => :desc)
+                 elsif params[:after]
+                   items.where("#{id_column} > ?", params[:after]).order(:id => :asc)
+                 else
+                   items.order(:id => :desc)
+                 end
+
+    page_items = page_items.limit(20)
+    page_items = page_items.includes(includes)
+    page_items = page_items.sort.reverse
+
+    newer_items_id = page_items.first.id if page_items.count.positive? && items.exists?(["#{id_column} > ?", page_items.first.id])
+    older_items_id = page_items.last.id if page_items.count.positive? && items.exists?(["#{id_column} < ?", page_items.last.id])
+
+    [page_items, newer_items_id, older_items_id]
+  end
+end