Skip to content

Instantly share code, notes, and snippets.

@solnic
Last active February 4, 2017 10:16
Show Gist options
  • Save solnic/b58fbee3b3831fd5faae to your computer and use it in GitHub Desktop.
Save solnic/b58fbee3b3831fd5faae to your computer and use it in GitHub Desktop.
require 'rom'
require 'byebug'
rom = ROM.setup(:memory) do
relation(:users)
relation(:tasks)
relation(:tags)
commands(:users) do
define(:create) do
input Transproc(:accept_keys, [:name])
result :one
end
end
commands(:tasks) do
define(:create) do
input Transproc(:accept_keys, [:title, :user])
def execute(tuples, user)
super(tuples.map { |t| t.merge(user: user.fetch(:name)) })
end
end
end
commands(:tags) do
define(:create) do
input Transproc(:accept_keys, [:name, :task])
def execute(tuples, task)
super(tuples.map { |t| t.merge(task: task.fetch(:title)) })
end
end
end
mappers do
define(:users) do
model name: 'User'
register_as :entity
attribute :name
combine :tasks, on: { name: :user } do
model name: 'Task'
attribute :title
combine :tags, on: { title: :task } do
model name: 'Tag'
attribute :name
end
end
end
end
end
input = {
user: {
name: 'Jane',
tasks: [
{
title: 'One',
tags: [{ name: 'red' }]
},
{
title: 'Two',
tags: [{ name: 'green' }, { name: 'blue' }]
}
]
}
}
cmd = rom.command([
{ user: :users }, [
:create, [
:tasks, [:create, [:tags, [:create]]]
]
]
])
puts (cmd >> rom.mappers[:users].entity).call(input).to_a.inspect
[#<User:0x007fc073f6caf8 @name="Jane", @tasks=[#<Task:0x007fc073f6d390 @title="One", @tags=[#<Tag:0x007fc073f6d5e8 @name="red">]>, #<Task:0x007fc073f6cd28 @title="Two", @tags=[#<Tag:0x007fc073f6d070 @name="green">, #<Tag:0x007fc073f6cf08 @name="blue">]>]>]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment