Advanced » Combining Relation Results
Ordinarily, Relation is used through Repository, but some applications may use
Relation directly. This removes the layer of syntactic sugar provided by
Repository, and so #combine
must be handled directly.
class Users < ROM::Relation[:memory]
def by_name(name)
restrict(name: name)
end
end
class Tasks < ROM::Relation[:memory]
def for_users(users)
restrict(user_id: users.map { |u| u[:id] })
end
end
rom_container = ROM.container(:memory) do |config|
config.register_relation(Users, Tasks)
end
users = rom_container.relation(:users)
tasks = rom_container.relation(:tasks)
# combine two relations into one
users.by_name('Jane').combine(tasks.for_users)
This is made possible by the auto-currying feature.
Auto-Curry
Every relation method that you defined supports auto-curry syntax. Currying means that you can reference a Relation and provide method arguments later:
users_by_name = rom.relation(:users).by_name
# call later on using short `[]` syntax
users_by_name['Jane']
# or more explicitly
users_by_name.call('Jane')