Skip to content

Instantly share code, notes, and snippets.

@olivierbuffon
Forked from itkrt2y/association.rb
Created October 18, 2023 18:35
Show Gist options
  • Select an option

  • Save olivierbuffon/ab5adfcddd462bd252f3206b67b05f3d to your computer and use it in GitHub Desktop.

Select an option

Save olivierbuffon/ab5adfcddd462bd252f3206b67b05f3d to your computer and use it in GitHub Desktop.
Association dataloader with graphql-ruby
# official docs: https://graphql-ruby.org/dataloader/sources.html
# app/graphql/sources/association.rb
class Sources::Association < ::GraphQL::Dataloader::Source
def initialize(association_name, preload_model = nil, preload_scope = nil)
@association_name = association_name
# `dataloader.with(Sources::Association, :foo, Model.preload(scope))` のように
# 最初からpreloadしたクラスを渡すと処理がbatchにならないため、別々に渡した上で内部で結合する
@scope = if preload_model && preload_scope
preload_model.preload(preload_scope)
end
end
def fetch(records)
::ActiveRecord::Associations::Preloader.new.preload(records, @association_name, @scope)
# Rails7
# ::ActiveRecord::Associations::Preloader.new(records: records, associations: @association_name, scope: @scope).call
records.map { |record| record.public_send(@association_name) }
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment