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