Skip to content

Instantly share code, notes, and snippets.

@artemeff
Last active December 14, 2015 17:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save artemeff/706587425672a4ae20ec to your computer and use it in GitHub Desktop.
Save artemeff/706587425672a4ae20ec to your computer and use it in GitHub Desktop.
require 'rom'
require 'virtus'
ROM.setup :memory
class User
include Virtus.model
attribute :name, String
attribute :role, Symbol, default: 'user'
end
class Users < ROM::Relation[:memory]
end
class UserMapper < ROM::Mapper
relation :users
register_as :entity
model User
end
class CreateAdmin < ROM::Commands::Create[:memory]
relation :users
register_as :create_admin
input ->(user) { user.merge(role: 'admin') }
end
class CreateManager < ROM::Commands::Create[:memory]
relation :users
register_as :create_manager
input ->(user) { user.merge(role: 'manager') }
end
class CreateUser < ROM::Commands::Create[:memory]
relation :users
register_as :create_user
end
ROM.finalize
rom = ROM.env
create_admin = rom.command(:users).create_admin
create_manager = rom.command(:users).create_manager
create_user = rom.command(:users).create_user
create_admin.call(name: 'John Doe')
create_manager.call(name: 'John Snow')
create_user.call(name: 'Nobody')
p rom.relation(:users).to_a
# => [{:name=>"John Doe", :role=>"admin"}, {:name=>"John Snow", :role=>"manager"}, {:name=>"Nobody"}]
p rom.relation(:users).as(:entity).to_a
# => [#<User:0x007fe249896f60 @name="John Doe", @role=:admin>, #<User:0x007fe249894670 @name="John Snow", @role=:manager>, #<User:0x007fe2498943f0 @name="Nobody", @role=:user>]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment