Rails Activerecord Relation: использование подзапроса в качестве таблицы для оператора SQL select

Может кто-нибудь помочь мне выяснить, как написать следующий SQL, используя Rails (я использую Rails 4) методы Activerecord? Я знаю, что вы можете сделать это с помощью find_by_sql, но я бы хотел сохранить активное отношение записи. Здесь sql для db postGreSQL, который я пытаюсь создать:

SELECT * FROM 
(SELECT DISTINCT ON(table_a.id) table_a.name as alias_a, table_b.id, table_b.time
FROM table_1
LEFT OUTER JOIN table_b ON table_a.id = table_b.id
ORDER BY table_a.id, table_b.time asc) AS subquery
ORDER BY alias_a asc

В моем подзапросе есть следующее (которое генерирует sql подзапроса выше):

@subquery = table_a.select("DISTINCT ON(table_a.id) table_a.name as alias_a, table_b.time")     
@subquery = @subquery.joins("LEFT OUTER JOIN table_b ON table_a.id = table_b.id")
@subquery = @subquery.order("table_a.id, table_b.time asc")

Но я не могу понять, как написать оператор select, который использует @subquery в качестве таблицы для внешнего оператора выбора.

Ответ 1

Используйте метод from() из интерфейса Active Record.

Например:

@subquery = table_a.select("DISTINCT ON(table_a.id) table_a.name as alias_a, table_b.time")     
@subquery = @subquery.joins("LEFT OUTER JOIN table_b ON table_a.id = table_b.id")
@subquery = @subquery.order("table_a.id, table_b.time asc")

Затем используйте его во внешнем запросе:

@query = OtherModel.from("(#{@subquery.to_sql}) table_name, other_model_table, etc ...").where(:field => table_name.alias_a) ...etc.