Sha256: 5a8267c4abfec5d28e2269700c2150dcb4ef42a26179f9a6fbf8dadb86e9fc2e

Contents?: true

Size: 1.75 KB

Versions: 3

Compression:

Stored size: 1.75 KB

Contents

require 'dry/core/inflector'
require 'rom/sql/association'

module ROM
  module SQL
    class Schema < ROM::Schema
      class AssociationsDSL < BasicObject
        attr_reader :source, :registry

        def initialize(source, &block)
          @source = source
          @registry = {}
          instance_exec(&block)
        end

        def one_to_many(target, options = {})
          if options[:through]
            many_to_many(target, options)
          else
            add(Association::OneToMany.new(source, target, options))
          end
        end
        alias_method :has_many, :one_to_many

        def one_to_one(target, options = {})
          if options[:through]
            one_to_one_through(target, options)
          else
            add(Association::OneToOne.new(source, target, options))
          end
        end

        def one_to_one_through(target, options = {})
          add(Association::OneToOneThrough.new(source, target, options))
        end

        def many_to_many(target, options = {})
          add(Association::ManyToMany.new(source, target, options))
        end

        def many_to_one(target, options = {})
          add(Association::ManyToOne.new(source, target, options))
        end

        def belongs_to(name, options = {})
          many_to_one(dataset_name(name), {as: name}.merge(options))
        end

        def has_one(name, options = {})
          one_to_one(dataset_name(name), {as: name}.merge(options))
        end

        def call
          AssociationSet.new(registry)
        end

        private

        def add(association)
          registry[association.name] = association
        end

        def dataset_name(name)
          ::Dry::Core::Inflector.pluralize(name).to_sym
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
rom-sql-1.0.0.beta3 lib/rom/sql/schema/associations_dsl.rb
rom-sql-1.0.0.beta2 lib/rom/sql/schema/associations_dsl.rb
rom-sql-1.0.0.beta1 lib/rom/sql/schema/associations_dsl.rb