class AutoAdmin::Node

Attributes

klass[RW]

Public Class Methods

new(klass) click to toggle source
# File lib/auto_admin/node.rb, line 43
def initialize(klass)
  self.klass = klass
end
nodes() click to toggle source
# File lib/auto_admin/node.rb, line 4
def nodes
  @nodes ||= begin
    Rails.application.eager_load!
    ActiveRecord::Base.descendants.each_with_object({}) do |klass, hash|
      next if klass.abstract_class? || klass.name.split('::').first == 'ActiveRecord'

      hash[klass.name] = AutoAdmin::Node.new(klass)
    end
  end
end
preload_associations!() click to toggle source
# File lib/auto_admin/node.rb, line 15
def preload_associations! # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
  return true if @preloading

  @preloading = true
  @preload_associations ||= begin
    nodes.values.each do |node|
      node.klass.reflect_on_all_associations(:has_many).each do |association|
        node.has_many association unless association.options[:through]
      end
      node.klass.reflect_on_all_associations(:has_one).each do |association|
        node.has_one association
      end
      node.klass.reflect_on_all_associations(:belongs_to).each do |association|
        node.belongs_to association unless association.polymorphic?
      end
    end
    true
  end
end
root_nodes() click to toggle source
# File lib/auto_admin/node.rb, line 35
def root_nodes
  nodes.values.select { |n| n.belongs_to.none? }.sort_by { |n| -n.weight }
end

Public Instance Methods

attributes() click to toggle source
# File lib/auto_admin/node.rb, line 63
def attributes
  klass.column_names - primary_keys - belongs_to.map(&:node).map { |hm| hm.to_s.foreign_key }
end
belongs_to(association = nil) click to toggle source
# File lib/auto_admin/node.rb, line 99
def belongs_to(association = nil)
  @belongs_to ||= Set.new
  if association
    node = self.class.nodes[association.klass.name]
    @belongs_to << Association.new(node, association.name)
  else
    self.class.preload_associations!
  end
  @belongs_to
end
define_routes!(ctx) click to toggle source
# File lib/auto_admin/node.rb, line 47
def define_routes!(ctx)
  ctx.resources resource_name, controller: 'resources', defaults: { node: klass.name }, only: %i(index show), shallow: true do
    has_many.map(&:node).each do |child_node|
      child_node.define_routes!(ctx)
    end
  end
end
has_many(association = nil) click to toggle source
# File lib/auto_admin/node.rb, line 75
def has_many(association = nil) # rubocop:disable Metrics/AbcSize
  @has_many ||= Set.new
  if association
    node = self.class.nodes[association.klass.name]
    node.belongs_to << Association.new(self, association.inverse_of) if association.inverse_of
    @has_many << Association.new(node, association.name)
  else
    self.class.preload_associations!
  end
  @has_many
end
has_one(association = nil) click to toggle source
# File lib/auto_admin/node.rb, line 87
def has_one(association = nil) # rubocop:disable Metrics/AbcSize
  @has_one ||= Set.new
  if association
    node = self.class.nodes[association.klass.name]
    node.belongs_to << Association.new(self, association.inverse_of) if association.inverse_of
    @has_one << Association.new(node, association.name)
  else
    self.class.preload_associations!
  end
  @has_one
end
polymorphic_path() click to toggle source
# File lib/auto_admin/node.rb, line 59
def polymorphic_path
  [resource_name]
end
primary_keys() click to toggle source
# File lib/auto_admin/node.rb, line 67
def primary_keys
  klass.respond_to?(:primary_keys) ? klass.primary_keys : [klass.primary_key]
end
resource_name() click to toggle source
# File lib/auto_admin/node.rb, line 55
def resource_name
  klass.name.demodulize.underscore.pluralize
end
weight() click to toggle source
# File lib/auto_admin/node.rb, line 71
def weight
  @weight ||= has_many.map(&:node).sum(&:weight) + 1
end