batch-loader
batch-loader copied to clipboard
Add `then` method to allow modifying loader value.
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.