Module: FastPage::ActiveRecordMethods

Defined in:
lib/fast_page/active_record_methods.rb

Instance Method Summary collapse

Instance Method Details

#deferred_join_loadObject

Raises:

  • (ArgumentError)


5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/fast_page/active_record_methods.rb', line 5

def deferred_join_load
  # Must have a limit or offset defined
  raise ArgumentError, "You must specify a limit or offset to use fast_page" if !limit_value && !offset_value

  # We load 1 additional record to determine if there is a next page.
  # This helps us avoid doing a count over all records
  @values[:limit] = limit_value + 1 if limit_value
  id_scope = dup
  id_scope = id_scope.except(:includes) unless references_eager_loaded_tables?

  # Check if ORDER BY contains aliases that might not exist in a pluck query
  ids = if order_references_select_aliases?
          # Use select approach to preserve SELECT clause aliases, then extract IDs
          id_scope.select(primary_key).map { |record| record.send(primary_key) }
        else
          # Standard pluck approach works fine
          id_scope.pluck(primary_key)
        end

  if limit_value
    @values[:limit] = limit_value - 1
    # Record if there is a next page
    @_has_next = ids.length > limit_value
    ids = ids.first(limit_value)
  end

  if ids.empty?
    @records = []
    @loaded = true
    return self
  end

  @records = where(primary_key => ids).unscope(:limit).unscope(:offset).load.records
  @loaded = true

  self
end