Class: Themis::AR::UseNestedValidationOnMethod

Inherits:
Object
  • Object
show all
Defined in:
lib/themis/ar/use_nested_validation_on_method.rb

Overview

Encapsulates BaseExtension#use_nested_validation_on method

Instance Method Summary collapse

Constructor Details

#initialize(model, associations, nested_associations) ⇒ UseNestedValidationOnMethod

Returns a new instance of UseNestedValidationOnMethod.

Parameters:

  • model (ActiveRecord::Base)

    base mdoel

  • associations (Array<Symbol>)

    associations on base model

  • nested_associations (Hash)

    deep nested associations



9
10
11
12
13
# File 'lib/themis/ar/use_nested_validation_on_method.rb', line 9

def initialize(model, associations, nested_associations)
  @model = model
  @associations = associations
  @nested_associations = nested_associations
end

Instance Method Details

#add_after_association_loaded_hooksObject

Add after_association_loaded hooks to associations so when association is loaded it would have same validation as base model.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/themis/ar/use_nested_validation_on_method.rb', line 36

def add_after_association_loaded_hooks
  @associations.each do |association_name|
    @model.after_association_loaded(association_name) do |association|
      validation = association.owner.themis_validation
      target     = association.target

      if validation
        if target.respond_to?(:each)
          target.each { |model| model.use_validation(validation) }
        elsif target.is_a? ActiveRecord::Base
          target.use_validation(validation) if validation
        end
      end
    end
  end
end

#executeObject

Trigger calling use_nested_validation_on on associations and adds after_association_loaded hooks.



17
18
19
20
21
22
23
# File 'lib/themis/ar/use_nested_validation_on_method.rb', line 17

def execute
  # Set themis_default_nested for current model
  @model.themis_default_nested = @associations unless @associations.empty?

  process_nested_validations
  add_after_association_loaded_hooks
end

#process_nested_validationsObject

Iterate over associations and recursively call #use_nested_validation_on



26
27
28
29
30
31
32
# File 'lib/themis/ar/use_nested_validation_on_method.rb', line 26

def process_nested_validations
  @nested_associations.each do |association_name, nested|
    reflection  = @model.reflect_on_association(association_name)
    model_class = reflection.class_name.constantize
    model_class.use_nested_validation_on(nested)
  end
end