# frozen_string_literal: true module Hanami module Model # Mapped proxy for ROM relations. # # It eliminates the need to use #as for repository queries # # @since 1.0.0 # @api private class MappedRelation < SimpleDelegator # Mapper name. # # With ROM mapping there is a link between the entity class and a generic # reference for it. Example: BookRepository references Book # as :entity. # # @since 1.0.0 # @api private MAPPER_NAME = :entity # @since 1.0.0 # @api private def self.mapper_name MAPPER_NAME end # @since 1.0.0 # @api private def initialize(relation) @relation = relation super(relation.as(self.class.mapper_name)) end # Access low level relation's attribute # # @param attribute [Symbol] the attribute name # # @return [ROM::SQL::Attribute] the attribute # # @raise [Hanami::Model::UnknownAttributeError] if the attribute cannot be found # # @since 1.2.0 # # @example # class UserRepository < Hanami::Repository # def by_matching_name(name) # users # .where(users[:name].ilike(name)) # .map_to(User) # .to_a # end # end def [](attribute) @relation[attribute] rescue KeyError => exception raise UnknownAttributeError.new(exception.message) end end end end