Class: Alchemy::ElementPreloader

Inherits:
Object
  • Object
show all
Defined in:
app/services/alchemy/element_preloader.rb

Overview

Preloads element trees with all associations and nested elements

This service efficiently loads element trees to avoid N+1 queries. It recursively preloads all nested elements to unlimited depth.

Examples:

Preload elements for a page version

preloader = Alchemy::ElementPreloader.new(page_version: page_version)
preloaded_elements = preloader.call

Instance Method Summary collapse

Constructor Details

#initialize(page_version:) ⇒ ElementPreloader

Returns a new instance of ElementPreloader.

Parameters:

  • page_version (PageVersion)

    The page version to preload elements for



15
16
17
18
19
20
21
# File 'app/services/alchemy/element_preloader.rb', line 15

def initialize(page_version:)
  @page_version = page_version
  ActiveRecord::Associations::Preloader.new(
    records: [page_version],
    associations: {page: :language}
  ).call
end

Instance Method Details

#callArray<Element>

Preloads and returns the element tree with all associations loaded

Returns:

  • (Array<Element>)

    Elements with preloaded nested elements



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'app/services/alchemy/element_preloader.rb', line 26

def call
  # Load all elements for the page version with associations
  all_elements = load_all_elements
  return [] if all_elements.empty?

  # Build parent -> children lookup and populate associations
  populate_nested_associations(all_elements)

  # Root elements are those without a parent
  root_elements = all_elements.values
    .select { |e| e.parent_element_id.nil? }
    .sort_by(&:position)
  return [] if root_elements.empty?

  preload_related_objects(root_elements)

  root_elements
end