Class: ActiveAdmin::GraphQL::RecordSource
- Inherits:
-
GraphQL::Dataloader::Source
- Object
- GraphQL::Dataloader::Source
- ActiveAdmin::GraphQL::RecordSource
- 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
- #composite_index(keys) ⇒ Object
- #fetch(ids) ⇒ Object
-
#initialize(model_class) ⇒ RecordSource
constructor
A new instance of RecordSource.
- #load_records(keys) ⇒ Object
- #normalized_keys(ids) ⇒ Object
- #single_column_index(keys) ⇒ Object
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 |