class Themis::AR::UseNestedValidationOnMethod

Encapsulates {Themis::AR::BaseExtension#use_nested_validation_on} method

Public Class Methods

new(model, associations, nested_associations) click to toggle source

@param [ActiveRecord::Base] model base mdoel @param [Array<Symbol>] associations associations on base model @param [Hash] nested_associations deep nested associations

# 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

Public Instance Methods

add_after_association_loaded_hooks() click to toggle source

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

# 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
execute() click to toggle source

Trigger calling use_nested_validation_on on associations and adds after_association_loaded hooks.

# 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_validations() click to toggle source

Iterate over associations and recursively call use_nested_validation_on

# 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