Конвертировать оператор SQL в запрос Arel Rails

Итак, давайте прямо: я изо всех сил пытаюсь дни преобразовать этот оператор SQL:

select * from (
    select distinct on (program_id) editions.*, programs.* 
    from editions inner join programs on editions.program_id = programs.id 
    where programs.station_id = 1) as editionsprograms 
order by fixed desc, published_at desc, time desc 
limit 4;

на запрос рельсов Арель. Кто-то имеет представление о том, как сделать запрос Arel, который будет иметь такой же эффект, как приведенный выше SQL?

1 ответ

Недавно нашел этот крутой проект http://www.scuttle.io/

Вы можете использовать метод from для выполнения сложной части вашего запроса (выбор из подзапроса). Сам подзапрос должен быть простым отображением (select, joins, where, так далее). Таким образом, результат будет примерно таким:

Edition.select('*')
.from(
  Editions.select('DISTINCT ON (program_id) editions.*, programs.*')
          .joins(:programs)
          .where(programs: { station_id: 1 })
)
.order(fixed: :desc, published_at: :desc, time: :desc)
.limit(4)

Это вернет записи Edition, с дополнительными данными из записи Программы, сохраненными в каждой. Чтобы избежать странностей этого типа результата, который также может просто выдавать ошибки и не может быть разрешен, вы можете использовать Arel напрямую (аналогичный синтаксис) или использовать .pluck в конце выщипывайте только те колонки, которые вам действительно нужны.

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