Class: ActiveAdmin::GraphQL::RecordSource

Inherits:
GraphQL::Dataloader::Source
  • Object
show all
Defined in:
lib/active_admin/graphql/record_source.rb

Overview

Batches find by primary key for belongs_to-style fields (graphql-ruby dataloader).

Instance Method Summary collapse

Constructor Details

#initialize(model_class) ⇒ RecordSource

Returns a new instance of RecordSource.



7
8
9
10
# File 'lib/active_admin/graphql/record_source.rb', line 7

def initialize(model_class)
  @model_class = model_class
  @pk = model_class.primary_key
end

Instance Method Details

#composite_index(keys) ⇒ Object



31
32
33
34
# File 'lib/active_admin/graphql/record_source.rb', line 31

def composite_index(keys)
  records = @model_class.where(@pk => keys).to_a
  records.index_by { |record| ActiveAdmin::PrimaryKey.dataloader_tuple_from_record(record) }
end

#fetch(ids) ⇒ Object



12
13
14
15
16
17
18
19
# File 'lib/active_admin/graphql/record_source.rb', line 12

def fetch(ids)
  keys = normalized_keys(ids)
  uniq = keys.compact.uniq
  return Array.new(ids.size) { nil } if uniq.empty?

  indexed = load_records(uniq)
  keys.map { |key| key.nil? ? nil : indexed[key] }
end

#load_records(keys) ⇒ Object



27
28
29
# File 'lib/active_admin/graphql/record_source.rb', line 27

def load_records(keys)
  ActiveAdmin::PrimaryKey.composite?(@model_class) ? composite_index(keys) : single_column_index(keys)
end

#normalized_keys(ids) ⇒ Object



21
22
23
24
25
# File 'lib/active_admin/graphql/record_source.rb', line 21

def normalized_keys(ids)
  ids.map do |raw|
    raw.nil? ? nil : ActiveAdmin::PrimaryKey.dataloader_tuple(@model_class, raw)
  end
end

#single_column_index(keys) ⇒ Object



36
37
38
39
40
# File 'lib/active_admin/graphql/record_source.rb', line 36

def single_column_index(keys)
  pk_sym = @pk.to_sym
  records = @model_class.where(pk_sym => keys).to_a
  records.index_by { |record| record.public_send(pk_sym) }
end