Ruby Object Mapper
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:
Adapters
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.
Synopsis
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 UserRelation < ROM::Relation[:memory]
base_name :users
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::Command
type :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).try { create(name: "Joe", age: 17) }
rom.command(:users).try { create(name: "Jane", age: 18) }
# reading relations using defined mappers
puts rom.read(:users).by_name("Jane").adults.to_a.inspect
# => [#<User:0x007fdba161cc48 @id=2, @name="Jane", @age=18>]
ROADMAP
ROM is on its way towards 1.0.0. Please refer to issues for details.
Community
- Official Blog
- Ruby Object Mapper mailing list
Credits
This project has a long history and wouldn't exist without following people:
License
See LICENSE
file.