Как сопоставить присоединение многих ко многим в Ruby Object Mapper

Дано:

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

Как написать mapper (или переработать отношение для работы с mapper), чтобы получить простой результат foo с атрибутом bars, в котором все столбцы связаны с таблицей foos_bars?

1 ответ

Создавать сложные объединения, как это, не рекомендуется, если у вас нет веских причин, таких как производительность. Намного проще использовать репозитории для составления отношений, определяя представления отношений, которые вам нужны для повторного использования, и комбинируя их различными способами в репозиториях. Следует также избегать определения пользовательских картографов, если у вас нет особых требований.

Я сделал суть, которая иллюстрирует это прямо здесь: https://gist.github.com/solnic/9307e1b2e3428718dd12

Мы работаем над новым набором документов, которые должным образом объяснят эти вещи.

Другие вопросы по тегам