Class: ActiveRecordBetterDependentErrorMessages::ErrorsCollector

Inherits:
Object
  • Object
show all
Defined in:
lib/active_record_better_dependent_error_messages/errors_collector.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model:, root_model:) ⇒ ErrorsCollector

Returns a new instance of ErrorsCollector.



11
12
13
14
# File 'lib/active_record_better_dependent_error_messages/errors_collector.rb', line 11

def initialize(model:, root_model:)
  @model = model
  @root_model = root_model
end

Instance Attribute Details

#modelObject (readonly)

Returns the value of attribute model.



2
3
4
# File 'lib/active_record_better_dependent_error_messages/errors_collector.rb', line 2

def model
  @model
end

#root_modelObject (readonly)

Returns the value of attribute root_model.



2
3
4
# File 'lib/active_record_better_dependent_error_messages/errors_collector.rb', line 2

def root_model
  @root_model
end

Class Method Details

.call(model:, root_model: nil) ⇒ Object



4
5
6
7
8
9
# File 'lib/active_record_better_dependent_error_messages/errors_collector.rb', line 4

def self.call(model:, root_model: nil)
  root_model ||= model

  collector = ActiveRecordBetterDependentErrorMessages::ErrorsCollector.new(model: model, root_model: root_model)
  collector.collect!
end

Instance Method Details

#collect!Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/active_record_better_dependent_error_messages/errors_collector.rb', line 16

def collect!
  model._reflections.each do |reflection_name, reflection|
    association = model.association(reflection_name)

    next if reflection.options[:dependent] != :destroy

    if reflection.macro == :has_many
      model.__send__(reflection_name).each do |sub_model|
        scan_sub_model_for_errors(sub_model)
        ActiveRecordBetterDependentErrorMessages::ErrorsCollector.(model: sub_model, root_model: model)
      end
    elsif reflection.macro == :has_one
      sub_model = model.__send__(reflection_name)
      scan_sub_model_for_errors(sub_model)
      ActiveRecordBetterDependentErrorMessages::ErrorsCollector.(model: sub_model, root_model: model)
    end
  end
end

#scan_sub_model_for_errors(sub_model) ⇒ Object



35
36
37
38
39
# File 'lib/active_record_better_dependent_error_messages/errors_collector.rb', line 35

def scan_sub_model_for_errors(sub_model)
  return if sub_model.errors.none?

  root_model.errors.add(:base, sub_model.errors.full_messages.join(". "))
end