Как соединиться через объединяющую таблицу в Ruby Object Mapper SQL

Учитывая таблицу foo, таблицу баров и таблицу foos_bars, все три с столбцами идентификаторов, подход к получению баров с foos, который может показаться в документации, выглядит примерно так:

class Foo < ROM::Relation[:sql]
  def with_foos_bars
    qualified.inner_join(:foos_bars, foo_id: :id)
  end

  def with_bars
    with_category_fixtures.qualified.inner_join(:categories, id: :bar_id)
  end
end

Тем не менее, #qualified применяется только к классу, так что это фактически просто квалификация "Foo" дважды, но нам нужно квалифицировать по крайней мере две таблицы для пригодного для использования SQL-запроса. То же самое можно сказать и о #prefix. Пропуск #qualified и префикса просто приводит к неоднозначному запросу SQL.

Чтобы уточнить: вопрос в том, как соединиться через таблицу соединений в Ruby Object Mapper?

1 ответ

Решение

Вам нужно использовать имена столбцов символов с соглашениями об именах сиквелов, так что-то вроде этого:

class Foo < ROM::Relation[:sql]
  def with_foos_bars
    qualified.inner_join(
      foos_bars, foos_bars__foo_id: foos__id
    )
  end

  def with_bars
    with_category_fixtures.qualified.inner_join(
      :categories, categories__id: :foos_bars__bar_id
    )
  end
end

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

Надеюсь, это поможет.

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