Skip to content

Instantly share code, notes, and snippets.

@sizer
Created June 1, 2018 08:55
Show Gist options
  • Save sizer/a31f3d482b858603fae593982cf16b97 to your computer and use it in GitHub Desktop.
Save sizer/a31f3d482b858603fae593982cf16b97 to your computer and use it in GitHub Desktop.
require 'rom-repository'
rom = ROM.container(:sql, 'sqlite::memory') do |config|
config.default.create_table(:users) do
primary_key :id
column :name, String, null: false
column :email, String, null: false
end
config.default.create_table(:tasks) do
primary_key :id
foreign_key :user_id, :users
column :title, String, null: false
end
config.default.create_table(:task_details) do
primary_key :id
foreign_key :task_id, :tasks
column :content, String, null: false
end
config.relation(:users) do
schema(infer: true) do
associations do
has_many :tasks
end
end
end
config.relation(:tasks) do
schema(infer: true) do
associations do
belongs_to :user
has_many :task_details
end
end
end
config.relation(:task_details) do
schema(infer: true) do
associations do
belongs_to :task
end
end
end
end
class UserRepo < ROM::Repository[:users]
relations :tasks
relations :task_details
def create_with_tasks(user)
command(:create, aggregate(tasks: :task_details)).call(user)
end
end
class TaskRepo < ROM::Repository[:tasks]
relations :task_details
end
user_repo = UserRepo.new(rom)
require 'pry'
binding.pry
user_repo.create_with_tasks(
name: 'Jane',
email: 'jane@doe.org',
tasks: [{
title: 'Task 1',
task_details: {
content: 'Content 1'
}
}, {
title: 'Task 2',
task_details: {
content: 'Content 2'
}
}]
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment