Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add example of a custom non-record-loading loader #89

Open
hidde-jan opened this issue Jul 16, 2018 · 3 comments
Open

Add example of a custom non-record-loading loader #89

hidde-jan opened this issue Jul 16, 2018 · 3 comments

Comments

@hidde-jan
Copy link

hidde-jan commented Jul 16, 2018

In the README, a CountLoader example is named, but it's not particularly detailed:

CountLoader.for(Shop, :smart_collections).load(context.shop_id),
CountLoader.for(Shop, :custom_collections).load(context.shop_id),

A clear example that demonstrates "You can also batch other stuff, not only load records from a DB" could be very helpful for new users. A great example would be something that does a HTTP request to some external API, combining two non-record-from-db-loading use cases.

@Amnesthesia
Copy link

I've been using the Record loader a lot, but run into a couple of problems that I haven't been able to figure out; I would love some more documentation on things like:

  • Is it possible to maintain order after the promises are fulfilled?
  • Can we batch HABTMs?

@razertory
Copy link

Hey, @hidde-jan, @Amnesthesia . CountLoader is just something like other loaders. The most important thing you have to do is to implement perform method . In the user-defined perform method, you have to create some key-value s by input keys using fulfill like this example. Here is the general usage

  • define your loader class and,
  • implement initialize, usually with some arguments you need and,
  • implement perform. In this method you have to get all results by keys, and create your key-value s

This example is far from ActiveRecord or any ORM

class MyLoader < GraphQL::Batch::Loader

  def initialize(arguments)
    @arguments = arguments
  end

  # Usually you don't have to implement your method unless some type casts are different
  def load(key)
    super(key)
  end

  # As it is refered from "You can also batch other stuff, not only load records from a DB"
  # In this example result is an object with attr `key`. Possiblly it is a redis obejct, json or rpc result defined in get_results
  def perform(keys)
    results = get_results(keys)

    results.each { |result| fulfill(result.key, result)} 

    keys.each { |key| fulfill(key, nil) unless fulfilled?(key) }
  end

  private

  def get_results(keys)
    #  your implementation, remember to return an array
  end
end

@ronocod
Copy link

ronocod commented Nov 15, 2021

There's an example of a CountLoader and some other loaders here: https://github.com/jamesbrooks/graphql-batch-loaders

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants