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

Version Path
ibrain-core-0.5.15 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.5.13 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.5.12 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.5.10 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.5.9 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.5.8 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.5.7 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.5.6 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.5.5 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.5.4 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.5.3 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.5.2 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.5.1 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.5.0 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.4.9 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.4.8 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.4.7 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.4.5 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.4.4 app/graphql/ibrain/loaders/association_loader.rb
ibrain-core-0.4.3 app/graphql/ibrain/loaders/association_loader.rb