与えられた:
create_table(:foos) do
primary_key(:id)
String(:name)
end
create_table(:bars) do
primary_key(:id)
String(:name)
end
create_table(:foos_bars) do
primary_key(:id)
foreign_key(:foo_id, :foos)
foreign_key(:bar_id, :bars)
String(:name)
end
class Foos < ROM::Relation[:sql]
dataset :foos
def with_bars(id)
prefix('foos').qualified.select(
:foos__id, :foos__name
).select_append(
:bars__id, :bars__name
).left_join(
:foos_bars, foos_bars__bars_id: :foos__id
).left_join(
:bars, bars__id: :foos_bars__bars_id
).where(foos__id: id)
end
end
class FoosModel
include Virtus.model
attribute :id
attribute :name
attribute :bars
end
class BarsModel
include Virtus.model
attribute :id
attribute :name
attribute :foos
end
ROMドキュメントに示されている(ただし説明されていない)キーワードのランダムなバリエーションをたくさん試しましたが、役に立ちませんでした。ドキュメントを Foos のマッパーにリテラルに解釈したものを次に示しますが、これは機能しません。
class FoosMapper < ROM::Mapper
relation :foos
register_as :foos
model Foo
prefix('foos')
attribute :id
attribute :name
group :bars do
model Bar
attribute :id, from: :bar
attribute :name, from: :bar
end
end
foos_bars テーブルによってリンクされたすべてのバーを持つ、bars 属性を持つ foo の単純な結果を取得するために、マッパーを作成する (またはマッパーで動作するようにリレーションを作り直す) 方法を教えてください。