Module: ProximalRecords::Adapters::Mysql2

Defined in:
lib/proximal_records/adapters/mysql2.rb

Instance Method Summary collapse

Instance Method Details

#proximal_records(scope) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/proximal_records/adapters/mysql2.rb', line 4

def proximal_records(scope)
  klass = self.class

  z = klass.select("#{klass.table_name}.*, IF(rownum < @num, 'previous', 'next') AS direction, rownum").arel
  t = klass.select("z.*, @rownum := @rownum + 1 AS rownum, CASE WHEN z.id = #{id} THEN @num := @rownum END").arel

  t.join(Arel.sql('JOIN (SELECT @rownum := 0, @num := NULL) n'))

  t.from("(#{scope.to_sql}) z")
  z.from("(#{t.to_sql}) #{klass.table_name}")

  sql = z.where(Arel.sql('rownum > @num - 2 AND rownum < @num + 2 AND rownum <> @num')).to_sql

  items = klass.find_by_sql(sql)

  if items[0]
    if items[0].direction == 'previous'
      [items[0], items[1]]
    else
      [nil, items[0]]
    end
  else
    [nil, nil]
  end
end