Module: AbAdmin::Concerns::AdminAddition

Extended by:
ActiveSupport::Concern
Included in:
Structure, User
Defined in:
lib/ab_admin/concerns/admin_addition.rb

Instance Method Summary collapse

Instance Method Details

#next_prev_by_url(scope, url, prev = false) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/ab_admin/concerns/admin_addition.rb', line 16

def next_prev_by_url(scope, url, prev=false)
  predicates = {'>' => '<', '<' => '>', 'desc' => 'asc', 'asc' => 'desc'}
  query = Rack::Utils.parse_nested_query(URI.parse(url).query).symbolize_keys
  query[:q] ||= {}
  order_str = query[:q]['s'] || 'id desc'
  order_col, order_mode = order_str.split
  quoted_order_col = self.class.quote_column(order_col)
  if prev
    query[:q]['s'] = ["#{order_col} #{predicates[order_mode]}", 'id desc']
    predicate = order_mode == 'desc' ? '>' : '<'
    id_predicate = '<'
  else
    query[:q]['s'] = ["#{order_col} #{order_mode}", 'id']
    predicate = order_mode == 'desc' ? '<' : '>'
    id_predicate = '>'
  end
  sql = "(#{quoted_order_col} #{predicate} :val OR (#{quoted_order_col} = :val AND #{self.class.quote_column('id')} #{id_predicate} #{self.id}))"
  scope.where(sql, :val => self.send(order_col)).ransack(query[:q]).result(:distinct => true).first
end