Skip to content

Instantly share code, notes, and snippets.

@aileron
Created February 27, 2019 05:14
Show Gist options
  • Save aileron/2474856cbc69dc6e0a5af771a85eaaba to your computer and use it in GitHub Desktop.
Save aileron/2474856cbc69dc6e0a5af771a85eaaba to your computer and use it in GitHub Desktop.
HasManyPrefetch
class HasManyPrefetch
attr_reader :name
attr_reader :values
attr_reader :method_name
attr_reader :fetcher
def initialize(name:, method_name: nil, &fetcher)
@name = name
@method_name = method_name || "#{name}_id"
@fetcher = fetcher
end
def fetch(collection)
fetcher.call(collection.pluck(method_name).sort.uniq)
end
def bind(collection)
values = fetch(collection)
collection.each do |element|
object_id = element[method_name]
bind_object = values[object_id]
element.define_singleton_method(name) { bind_object }
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment