class ActiveAdmin::Exportable::Exporter::RootStruct

Public Class Methods

new(node:, remove_ids:, includes: []) click to toggle source
# File lib/active_admin/exportable/exporter.rb, line 28
def initialize(node:, remove_ids:, includes: [])
  @node = node
  @includes = includes
  @remove_ids = remove_ids
end

Public Instance Methods

data() click to toggle source
# File lib/active_admin/exportable/exporter.rb, line 34
def data
  if @node.respond_to?(:size)
    @node.map do |n|
      generate_data(node: n, includes: @includes)
    end
  else
    generate_data(node: @node, includes: @includes)
  end
end

Private Instance Methods

associations_data(node:, includes:) click to toggle source
# File lib/active_admin/exportable/exporter.rb, line 66
def associations_data(node:, includes:)
  association_data = generate_association_data(node: node, includes: includes)
  return [association_data.data] if association_data.instance_of?(AssociationStruct)

  association_data.flatten.map(&:data)
end
generate_association_data(node:, includes:) click to toggle source
# File lib/active_admin/exportable/exporter.rb, line 73
def generate_association_data(node:, includes:)
  return [] if includes.nil? || includes.empty?

  case includes
  when Hash
    generate_association_data_for_hash(node: node, includes: includes)
  when Array
    generate_association_data_for_array(node: node, includes: includes)
  when Symbol
    generate_association_data_for_symbol(node: node, includes: includes)
  end
end
generate_association_data_for_array(node:, includes:) click to toggle source
# File lib/active_admin/exportable/exporter.rb, line 93
def generate_association_data_for_array(node:, includes:)
  includes.map do |association_name|
    # It needs to "pass" again because we don't know the element's kinds.
    generate_association_data(node: node, includes: association_name)
  end
end
generate_association_data_for_hash(node:, includes:) click to toggle source
# File lib/active_admin/exportable/exporter.rb, line 86
def generate_association_data_for_hash(node:, includes:)
  includes.map do |association_name, inner_includes|
    AssociationStruct.new(record: node, association_name: association_name, remove_ids: @remove_ids,
                          next_level_includes: inner_includes)
  end
end
generate_association_data_for_symbol(node:, includes:) click to toggle source
# File lib/active_admin/exportable/exporter.rb, line 100
def generate_association_data_for_symbol(node:, includes:)
  if node.respond_to?(:size)
    node.map do |inner_node|
      AssociationStruct.new(record: inner_node, association_name: includes, remove_ids: @remove_ids)
    end
  else
    AssociationStruct.new(record: node, association_name: includes, remove_ids: @remove_ids)
  end
end
generate_data(node:, includes:) click to toggle source
# File lib/active_admin/exportable/exporter.rb, line 46
def generate_data(node:, includes:)
  attributes = node.attributes
  a_data = associations_data(node: node, includes: includes)

  if @remove_ids
    attributes.delete('id')
    a_data.map do |a|
      [a[:foreign_type], a[:foreign_key]] if a[:kind] == 'belongs_to'
    end.flatten.compact.each do |key|
      attributes.delete(key)
    end
  end

  {
    class_name: node.class.name,
    attributes: attributes,
    associations: a_data
  }
end