class EagerBeaver

Attributes

model[R]
preloads[R]

Public Class Methods

new(model, preloads) click to toggle source
# File lib/eagerbeaver.rb, line 4
def initialize(model, preloads)
  @model = model
  @preloads = preloads
end

Public Instance Methods

errors() click to toggle source
# File lib/eagerbeaver.rb, line 9
def errors
  trace(model, preloads).flatten.compact
end

Private Instance Methods

association_name(model_string, association_name_or_alias) click to toggle source
# File lib/eagerbeaver.rb, line 28
def association_name(model_string, association_name_or_alias)
  association = match_association(model_string.to_s, association_name_or_alias)
  return association_name_or_alias unless association

  options = association.options

  if options[:through] && options[:source]
    source = options[:source_type] || options[:source]
    through = association_name(model_string, options[:through]) ||
      association_name(options[:through], source)
    association_name(through, source)
  else
    options[:class_name] || association_name_or_alias
  end
end
constantize(model_string) click to toggle source
# File lib/eagerbeaver.rb, line 48
def constantize(model_string)
  if model_string.first == model_string.first.upcase
    model_string.singularize.constantize
  else
    model_string.split('_').map(&:capitalize).join.singularize.constantize
  end
end
match_association(model_string, association) click to toggle source
# File lib/eagerbeaver.rb, line 44
def match_association(model_string, association)
  constantize(model_string).reflect_on_all_associations.find { |a| a.name == association }
end
trace(model, assoc) click to toggle source
# File lib/eagerbeaver.rb, line 15
def trace(model, assoc)
  model_string = model.to_s.singularize.classify

  if assoc.is_a?(Array)
    assoc.map { |a| trace(model, a) }
  elsif assoc.is_a?(Hash)
    val = Array(trace(association_name(model_string, assoc.keys.first), assoc.values.first))
    val << trace(model, assoc.keys.first)
  elsif assoc.is_a?(Symbol) && !model_string.constantize.reflect_on_all_associations.map(&:name).include?(assoc)
    "#{assoc} is not an association of #{model_string}"
  end
end