Module: Railsmith::BaseService::EagerLoading::ClassMethods

Defined in:
lib/railsmith/base_service/eager_loading.rb

Overview

Class-level DSL macros for declaring eager loads on a service.

Instance Method Summary collapse

Instance Method Details

#eager_loadsObject

Returns the accumulated eager-load arguments for this class.



51
52
53
# File 'lib/railsmith/base_service/eager_loading.rb', line 51

def eager_loads
  @eager_loads || []
end

#eager_loads_for(action) ⇒ Array

Returns eager-load arguments that apply to the given action.

Parameters:

  • action (Symbol, String, nil)

Returns:

  • (Array)


59
60
61
62
63
64
65
66
67
# File 'lib/railsmith/base_service/eager_loading.rb', line 59

def eager_loads_for(action)
  rules = @eager_load_rules || []
  return eager_loads if rules.empty?

  normalized_action = action&.to_sym

  matching_rules = rules.select { |rule| eager_load_rule_applies?(rule, normalized_action) }
  matching_rules.flat_map { |rule| rule.fetch(:args) }
end

#includes(*args, **kwargs) ⇒ Object

Declare one or more eager loads. Multiple calls are additive.

Accepts the same arguments as ActiveRecord’s ‘includes`:

includes :foo, :bar
includes foo: :bar
includes foo: [:bar, :baz]

You can scope eager loads to specific actions:

includes :readers, only: %i[find list]
includes :audit_logs, except: %i[list]


37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/railsmith/base_service/eager_loading.rb', line 37

def includes(*args, **kwargs)
  only = kwargs.delete(:only)
  except = kwargs.delete(:except)
  validate_includes_scope!(only:, except:)

  args << kwargs unless kwargs.empty?

  @eager_loads ||= []
  @eager_loads.concat(args)

  add_eager_load_rule(args:, only:, except:)
end

#inherited(subclass) ⇒ Object



69
70
71
72
73
# File 'lib/railsmith/base_service/eager_loading.rb', line 69

def inherited(subclass)
  super
  subclass.instance_variable_set(:@eager_loads, eager_loads.dup)
  subclass.instance_variable_set(:@eager_load_rules, eager_load_rules_dup)
end