0

与えられた:

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 の単純な結果を取得するために、マッパーを作成する (またはマッパーで動作するようにリレーションを作り直す) 方法を教えてください。

4

1 に答える 1