lib/goldiloader/custom_preloads.rb in goldiloader-5.1.0 vs lib/goldiloader/custom_preloads.rb in goldiloader-5.2.0
- old
+ new
@@ -8,11 +8,11 @@
end
def preloaded(model, cache_name:, key:, &block)
unless preloaded?(cache_name)
ids = models.map do |record|
- record.public_send(key)
+ key_from_record(record, key)
end
# We're using instance_exec instead of a simple yield to make sure that the
# given block does not have any references to the model instance as this might
# lead to unexpected results. The block will be executed in the context of the
@@ -24,16 +24,27 @@
fetch_preloaded(cache_name, model, key: key)
end
private
+ def key_from_record(record, key_or_key_list)
+ if key_or_key_list.is_a?(Array)
+ # allow passing an array of keys that will be collected from the record
+ key_or_key_list.map do |key|
+ record.public_send(key)
+ end
+ else
+ record.public_send(key_or_key_list)
+ end
+ end
+
def store_preloaded(cache_name, preloaded_hash)
@custom_preloads ||= {}
@custom_preloads[cache_name] = preloaded_hash
end
def fetch_preloaded(cache_name, instance, key:)
- @custom_preloads&.dig(cache_name, instance.public_send(key))
+ @custom_preloads&.dig(cache_name, key_from_record(instance, key))
end
def preloaded?(cache_name)
@custom_preloads&.key?(cache_name)
end