lib/hanami/model/associations/belongs_to.rb in hanami-model-1.0.4 vs lib/hanami/model/associations/belongs_to.rb in hanami-model-1.1.0.beta1

- old
+ new

@@ -3,16 +3,97 @@ module Hanami module Model module Associations # Many-To-One association # - # @since 0.7.0 + # @since 1.1.0 # @api private class BelongsTo - # @since 0.7.0 + # @since 1.1.0 # @api private def self.schema_type(entity) Sql::Types::Schema::AssociationType.new(entity) + end + + # @since 1.1.0 + # @api private + attr_reader :repository + + # @since 1.1.0 + # @api private + attr_reader :source + + # @since 1.1.0 + # @api private + attr_reader :target + + # @since 1.1.0 + # @api private + attr_reader :subject + + # @since 1.1.0 + # @api private + attr_reader :scope + + # @since 1.1.0 + # @api private + def initialize(repository, source, target, subject, scope = nil) + @repository = repository + @source = source + @target = target + @subject = subject.to_hash unless subject.nil? + @scope = scope || _build_scope + freeze + end + + # @since 1.1.0 + # @api private + def one + scope.one + end + + private + + # @since 1.1.0 + # @api private + def container + repository.container + end + + # @since 1.1.0 + # @api private + def primary_key + association_keys.first + end + + # @since 1.1.0 + # @api private + def relation(name) + repository.relations[Hanami::Utils::String.pluralize(name)] + end + + # @since 1.1.0 + # @api private + def foreign_key + association_keys.last + end + + # Returns primary key and foreign key + # + # @since 1.1.0 + # @api private + def association_keys + relation(source) + .associations[target] + .__send__(:join_key_map, container.relations) + end + + # @since 1.1.0 + # @api private + def _build_scope + result = relation(target) + result = result.where(foreign_key => subject.fetch(primary_key)) unless subject.nil? + result.as(Model::MappedRelation.mapper_name) end end end end end