Ruby Object Mapper (ROM) is an experimental Ruby library with the goal to provide powerful object mapping capabilities without limiting the full power of your datastore.
Learn more:
See issues for a list of adapters that are planned to be added soon.
ROM can be used with Rails next to ActiveRecord via rom-rails railtie. Integration with other frameworks is planned.
ROM.setup(:memory)
# This is our domain-specific class
class User
attr_reader :name, :age
def initialize(attributes)
@name, @age = attributes.values_at(:name, :age)
end
end
# Here we define user relation which encapsulates accessing user data that
# we can map to domain objects
class Users < ROM::Relation[:memory]
def by_name(name)
restrict(name: name)
end
def adults
find_all { |user| user[:age] >= 18 }
end
end
# Even though mappers can be derived from model definitions here's how you
# could define it explicitly
class UserMapper < ROM::Mapper
relation :users
model User
attribute :name
attribute :age
end
# You can define specialized commands that handle creating, updating and deleting
# data, those classes can use external input param handlers and validators too
class CreateUser < ROM::Commands::Create[:memory]
register_as :create
relation :users
result :one
end
# finalize the setup and retrieve object registry (aka ROM env)
rom = ROM.finalize.env
# accessing defined commands
rom.command(:users).create.call(name: "Joe", age: 17)
rom.command(:users).create.call(name: "Joe", age: 17)
# reading relations using defined mappers
puts rom.read(:users).by_name("Jane").adults.to_a.inspect
# => [#<User:0x007fdba161cc48 @id=2, @name="Jane", @age=18>]
ROM is on its way towards 1.0.0. Please refer to issues for details.
- Official Blog
- Ruby Object Mapper mailing list
This project has a long history and wouldn't exist without following people:
See LICENSE
file.