Sha256: efc3b2c93b32a6e88e455359db75146f7fac10752f9c1a987cae6bfb2030b0cc

Contents?: true

Size: 1.69 KB

Versions: 3

Compression:

Stored size: 1.69 KB

Contents

module ROM
  module SQL
    class Association
      class ManyToOne < Association
        result :one

        # @api public
        def call(relations)
          left = relations[target.relation]
          right = relations[source.relation]

          right_pk = right.schema.primary_key.map { |a| a.meta[:name] }
          right_fk = right.foreign_key(target.relation)

          pk_to_fk = Hash[right_pk.product(Array(left.foreign_key(source.relation)))]

          columns = left.header.qualified.to_a + right.header
            .project(*right_pk)
            .rename(pk_to_fk)
            .qualified.to_a

          relation = left
            .inner_join(source, right_fk => left.primary_key)
            .select(*columns)
            .order(*right.header.project(*right.primary_key).qualified)

          relation.with(attributes: relation.header.names)
        end

        # @api public
        def combine_keys(relations)
          Hash[*with_keys(relations)]
        end

        # @api public
        def join_keys(relations)
          with_keys(relations) { |source_key, target_key|
            { qualify(source, source_key) => qualify(target, target_key) }
          }
        end

        # @api private
        def associate(relations, child, parent)
          fk, pk = join_key_map(relations)
          child.merge(fk => parent.fetch(pk))
        end

        protected

        # @api private
        def with_keys(relations, &block)
          source_key = relations[source.relation].foreign_key(target.relation)
          target_key = relations[target.relation].primary_key
          return [source_key, target_key] unless block
          yield(source_key, target_key)
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
rom-sql-0.9.1 lib/rom/sql/association/many_to_one.rb
rom-sql-0.9.0 lib/rom/sql/association/many_to_one.rb
rom-sql-0.8.0 lib/rom/sql/association/many_to_one.rb