rom 是个新东西,感觉比 AR 要难学一些。不过可以直接在内存里,这对测试应该很有帮助吧。有没有熟悉的网友介绍一下用法。
require 'rom'
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
restrict { |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
register_as :entity
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: "Jane", age: 18)
# reading relations using defined mappers
puts rom.relation(:users) { |r| r.adults }.as(:entity).to_a.inspect
# => [#<User:0x007fdba161cc48 @id=2, @name="Jane", @age=18>]