lib/rom/repository/relation_proxy/wrap.rb in rom-repository-1.0.2 vs lib/rom/repository/relation_proxy/wrap.rb in rom-repository-1.1.0
- old
+ new
@@ -13,20 +13,19 @@
# @param [Hash] options
#
# @return [RelationProxy]
#
# @api public
- def wrap(options)
- wraps = options.map { |(name, (relation, keys))|
- relation.wrapped(name, keys)
- }
+ def wrap(*names, **options)
+ new_wraps = wraps_from_names(names) + wraps_from_options(options)
- relation = wraps.reduce(self) { |a, e|
- a.relation.for_wrap(e.meta.fetch(:keys), e.base_name.relation)
+ relation = new_wraps.reduce(self) { |a, e|
+ name = e.meta[:wrap_from_assoc] ? e.meta[:combine_name] : e.base_name.relation
+ a.relation.for_wrap(e.meta.fetch(:keys), name)
}
- __new__(relation, meta: { wraps: wraps })
+ __new__(relation, meta: { wraps: wraps + new_wraps })
end
# Shortcut to wrap parents
#
# @example
@@ -50,11 +49,29 @@
# so that correct mapper can be generated
#
# @return [RelationProxy]
#
# @api private
- def wrapped(name, keys)
- with(name: name, meta: { keys: keys, wrap: true, combine_name: name })
+ def wrapped(name, keys, wrap_from_assoc = false)
+ with(
+ name: name,
+ meta: {
+ keys: keys, wrap_from_assoc: wrap_from_assoc, wrap: true, combine_name: name
+ }
+ )
+ end
+
+ # @api private
+ def wraps_from_options(options)
+ options.map { |(name, (relation, keys))| relation.wrapped(name, keys) }
+ end
+
+ # @api private
+ def wraps_from_names(names)
+ names.map { |name|
+ assoc = associations[name]
+ registry[assoc.target].wrapped(name, assoc.combine_keys(__registry__), true)
+ }
end
end
end
end
end