Конвертировать оператор 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 ответ
Вы можете использовать метод 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
в конце выщипывайте только те колонки, которые вам действительно нужны.