Class: ROM::Repository

Inherits:
Object
  • Object
show all
Extended by:
Dry::Core::Cache, Dry::Core::ClassAttributes, Initializer, ClassInterface
Defined in:
lib/rom/repository.rb,
lib/rom/repository/root.rb,
lib/rom/repository/version.rb,
lib/rom/repository/class_interface.rb,
lib/rom/repository/relation_reader.rb
more...

Overview

Abstract repository class to inherit from

A repository provides access to composable relations and commands. Its job is to provide application-specific data that is already materialized, so that relations don’t leak into your application layer.

Typically, you’re going to work with Repository::Root that is configured to use a single relation as its root, and compose aggregates and use changesets and commands against the root relation.

Examples:

rom = ROM.container(:sql, 'sqlite::memory') do |conf|
  conf.default.create_table(:users) do
    primary_key :id
    column :name, String
  end

  conf.default.create_table(:tasks) do
    primary_key :id
    column :user_id, Integer
    column :title, String
  end

  conf.relation(:users) do
    associations do
      has_many :tasks
    end
  end
end

class UserRepo < ROM::Repository[:users]
  def users_with_tasks
    aggregate(:tasks).to_a
  end
end

user_repo = UserRepo.new(rom)
user_repo.users_with_tasks

See Also:

Direct Known Subclasses

Root

Defined Under Namespace

Modules: ClassInterface Classes: RelationReader, Root

Constant Summary collapse

VERSION =
'5.4.2'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ClassInterface

[], commands, inherited, new, use

Constructor Details

#initializeRepository

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Initializes a new repository object

[View source]

108
109
110
111
# File 'lib/rom/repository.rb', line 108

def initialize(*, **)
  super
  @relations = {}
end

Instance Attribute Details

#auto_structBoolean (readonly)

Returns The container used to set up a repo.

Returns:

  • (Boolean)

    The container used to set up a repo


99
# File 'lib/rom/repository.rb', line 99

option :auto_struct, default: -> { self.class.auto_struct }

#containerROM::Container (readonly)

Returns The container used to set up a repo.

Returns:

  • (ROM::Container)

    The container used to set up a repo


91
# File 'lib/rom/repository.rb', line 91

option :container, allow: ROM::Container

#relationsObject (readonly)


103
104
105
# File 'lib/rom/repository.rb', line 103

def relations
  @relations
end

#struct_namespaceModule, Class (readonly)

Returns The namespace for auto-generated structs.

Returns:

  • (Module, Class)

    The namespace for auto-generated structs


95
# File 'lib/rom/repository.rb', line 95

option :struct_namespace, default: -> { self.class.struct_namespace }

Class Method Details

.auto_structObject

Get or set struct namespace

[View source]

73
# File 'lib/rom/repository.rb', line 73

defines :auto_struct

.relation_readerModule

Get or set relation reader module

Returns:

  • (Module)
[View source]

84
# File 'lib/rom/repository.rb', line 84

defines :relation_reader

Instance Method Details

#inspectString

Return a string representation of a repository object

Returns:

  • (String)
[View source]

155
156
157
# File 'lib/rom/repository.rb', line 155

def inspect
  %(#<#{self.class} struct_namespace=#{struct_namespace} auto_struct=#{auto_struct}>)
end

#transactionObject

Open a database transaction

Examples:

commited transaction

user = transaction do |t|
  create(changeset(name: 'Jane'))
end

user
# => #<ROM::Struct::User id=1 name="Jane">

with a rollback

user = transaction do |t|
  changeset(name: 'Jane').commit
  t.rollback!
end

user
# nil

with automatic savepoints

user = transaction(auto_savepoint: true) do
  create(changeset(name: 'Jane'))

  transaction do |t|
    update(changeset(name: 'John'))
    t.rollback!
  end
end

user
# => #<ROM::Struct::User id=1 name="Jane">
[View source]

146
147
148
# File 'lib/rom/repository.rb', line 146

def transaction(...)
  container.gateways[:default].transaction(...)
end