36 lines
806 B
Ruby
36 lines
806 B
Ruby
module Draper
|
|
# @private
|
|
class DecoratedAssociation
|
|
|
|
def initialize(owner, association, options)
|
|
options.assert_valid_keys(:with, :scope, :context)
|
|
|
|
@owner = owner
|
|
@association = association
|
|
|
|
@scope = options[:scope]
|
|
|
|
decorator_class = options[:with]
|
|
context = options.fetch(:context, ->(context){ context })
|
|
@factory = Draper::Factory.new(with: decorator_class, context: context)
|
|
end
|
|
|
|
def call
|
|
decorate unless defined?(@decorated)
|
|
@decorated
|
|
end
|
|
|
|
private
|
|
|
|
attr_reader :factory, :owner, :association, :scope
|
|
|
|
def decorate
|
|
associated = owner.object.send(association)
|
|
associated = associated.send(scope) if scope
|
|
|
|
@decorated = factory.decorate(associated, context_args: owner.context)
|
|
end
|
|
|
|
end
|
|
end
|