Sha256: eb24e4bf24a0c2ee7c47affb22c707f05a62df302aa158c42d4d21c2b2881f35
Contents?: true
Size: 1.54 KB
Versions: 60
Compression:
Stored size: 1.54 KB
Contents
# frozen_string_literal: true # ref: https://zenn.dev/necocoa/articles/setup-graphql-batch module Ibrain module Loaders class AssociationLoader < GraphQL::Batch::Loader def self.validate(model, association_name) new(model, association_name) nil end def initialize(model, association_name) super() @model = model @association_name = association_name validate end def load(record) unless record.is_a?(@model) raise TypeError, "#{@model} loader can't load association for #{record.class}" end return Promise.resolve(read_association(record)) if association_loaded?(record) super end # We want to load the associations on all records, even if they have the same id def cache_key(record) record.object_id end def perform(records) preload_association(records) records.each { |record| fulfill(record, read_association(record)) } end private def validate return if @model.reflect_on_association(@association_name) raise ArgumentError, "No association #{@association_name} on #{@model}" end def preload_association(records) ::ActiveRecord::Associations::Preloader.new.preload(records, @association_name) end def read_association(record) record.public_send(@association_name) end def association_loaded?(record) record.association(@association_name).loaded? end end end end
Version data entries
60 entries across 60 versions & 1 rubygems