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
-
#eager_loads ⇒ Object
Returns the accumulated eager-load arguments for this class.
-
#eager_loads_for(action) ⇒ Array
Returns eager-load arguments that apply to the given action.
-
#includes(*args, **kwargs) ⇒ Object
Declare one or more eager loads.
- #inherited(subclass) ⇒ Object
Instance Method Details
#eager_loads ⇒ Object
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.
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 |