batch-loader icon indicating copy to clipboard operation
batch-loader copied to clipboard

Add `then` method to allow modifying loader value.

Open v2kovac opened this issue 5 months ago • 0 comments

Suggested change:

I only wanted this for graphql, but i added to either use case, I can change it to be more limited if you want.

From the graphql spec, this change enables something like this:

  def user
    BatchLoader::GraphQL.for(object.user_id).batch(default_value: nil) do |user_ids, loader|
      User.where(id: user_ids).each { |user| loader.call(user.id, user) }
    end
  end

  def user_id
    user.then(&:id)
  end

  def user_name
    user.then(&:name)
  end

Why do we need this? Anytime I want to re-use a batch loader in graphql I have to make it a new nested graphql type within the type i'm working, you can't use the same loader across fields. Although in this case User should be a nested type, more generally there are cases where you want a flatter structure. This change really makes this repo feature parity with the "promise" implementations that allow you to manipulate the promises after they're fulfilled, this is very frequently used with these other repos where people refer to the same batch loader to extract different pieces of info from the same underlying model wherever they want, the batch loader shouldn't determine how we use it in graphql.

v2kovac avatar Jan 09 '24 18:01 v2kovac