Module: ActiveConformity::ConformableExtensions

Extended by:
ActiveSupport::Concern
Defined in:
lib/active_conformity/conformable_extensions.rb

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(m, *args, &block) ⇒ Object (private)



96
97
98
99
100
101
102
# File 'lib/active_conformity/conformable_extensions.rb', line 96

def method_missing(m, *args, &block)
  if m.to_sym == :conformity_set && !self.class.column_names.include?(m.to_s)
    conformable.try(:conformity_set)
  else
    super
  end
end

Instance Method Details

#add_conformity_set!(conformity_set = {}, conformist_type) ⇒ Object



62
63
64
65
66
67
# File 'lib/active_conformity/conformable_extensions.rb', line 62

def add_conformity_set!(conformity_set = {}, conformist_type)
  conformable_attrs = {conformable_id: self.id, conformable_type: self.class.name, conformist_type: conformist_type}
  @conformable = Conformable.where(conformable_attrs).first_or_create
  @conformable.add_conformity_set(conformity_set)
  @conformable.save!
end

#add_self_to_conformable_referencesObject



77
78
79
80
# File 'lib/active_conformity/conformable_extensions.rb', line 77

def add_self_to_conformable_references
  self if Conformable.where(conformable_id: self.id,
  conformable_type: self.class.name).any?
end

#aggregate_conformity_setObject



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/active_conformity/conformable_extensions.rb', line 32

def aggregate_conformity_set
  acs = {}
  return acs if !conformable_references.any? #need to think about this a little more
  conformable_references.each do |c|
    # This could be more efficient with some advanced sql techniques
    # Also need indexes on these
    c = Conformable.find_by!(conformable_id: c.id, conformable_type: c.class.name).conformity_set
    c = JSON.parse(c) if c.is_a?(String)
    acs.merge!(c)
  end
  acs
end

#conformableObject



57
58
59
60
# File 'lib/active_conformity/conformable_extensions.rb', line 57

def conformable
  @conformable ||= Conformable.find_by(conformable_id: self.id, conformable_type: self.class.name)
  @conformable
end

#conformable_referencesObject



69
70
71
72
73
74
75
# File 'lib/active_conformity/conformable_extensions.rb', line 69

def conformable_references
  return @conformable_references if defined? @conformable_references
  @conformable_references = Set.new
  @conformable_references.merge conformable_references_from_associations
  @conformable_references.add add_self_to_conformable_references
  @conformable_references = @conformable_references.to_a.compact
end

#conforming_dependents_conform?Boolean

Returns:

  • (Boolean)


45
46
47
48
49
# File 'lib/active_conformity/conformable_extensions.rb', line 45

def conforming_dependents_conform?
  return true if dependents.blank?
  !dependents.flat_map { |da| self.send(da)}
  .any?{ |da| !da.conforms? }
end

#conformity_errorsObject



28
29
30
# File 'lib/active_conformity/conformable_extensions.rb', line 28

def conformity_errors
  validator.errors.messages
end

#conformity_sets_by_referenceObject



51
52
53
54
55
# File 'lib/active_conformity/conformable_extensions.rb', line 51

def conformity_sets_by_reference
  conformable_references.flat_map do |cr|
    {"#{cr.class.name} id: #{cr.id}"=> cr.conformable.conformity_set}
  end
end

#conforms?Boolean

Returns:

  • (Boolean)


24
25
26
# File 'lib/active_conformity/conformable_extensions.rb', line 24

def conforms?
  validator.conforms? && conforming_dependents_conform?
end

#remove_conformity_rule!(attr) ⇒ Object



82
83
84
# File 'lib/active_conformity/conformable_extensions.rb', line 82

def remove_conformity_rule!(attr)
  conformable.remove_coformity_rule!(attr)
end

#remove_rulesObject



86
87
88
# File 'lib/active_conformity/conformable_extensions.rb', line 86

def remove_rules
  conformable.remove_rules!
end