Skip to content

Instantly share code, notes, and snippets.

@carlisia
Last active January 8, 2019 10:23
Show Gist options
  • Save carlisia/1269fa6680487b658c9f to your computer and use it in GitHub Desktop.
Save carlisia/1269fa6680487b658c9f to your computer and use it in GitHub Desktop.
ROM - References for creating a custom adapter
@carlisia
Copy link
Author

carlisia commented May 9, 2015

require 'rom'

ROM.setup(:memory)

class User
  attr_reader :name, :age

  def initialize(attributes)
    @name, @age = attributes.values_at(:name, :age)
  end
end

class Users < ROM::Relation[:memory]
  def by_name(name)
    restrict(name: name)
  end

  def adults
    restrict { |user| user[:age] >= 18 }
  end
end

class UserMapper < ROM::Mapper
  relation :users
  register_as :entity

  model User

  attribute :name
  attribute :age
end

class CreateUser < ROM::Commands::Create[:memory]
  register_as :create
  relation :users
  result :one
end

class UpdateUser < ROM::Commands::Update[:memory]
  register_as :update
  relation :users
  result :one
end

rom = ROM.finalize.env

user1 = rom.command(:users).as(:entity).create.call(name: "Joe", age: 17)
user2 = rom.command(:users).as(:entity).update.set(name: "Jane", age: 18)
puts user1.class, user2.class # => User, Hash

@carlisia
Copy link
Author

Q: "What's a repository?"

A: ""Repository" is poorly named, as it doesn't actually reflect a repository pattern
the Adapter's repository is the class it uses to interact with whatever it's backend is
more of a gateway
thus, each adapter has 1 repository
but, what you register is an instance of an adapter
which in turn ends up with an instance of it's internal repository class"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment