Как выбрать самую последнюю запись в Rails через соединение с другой таблицей с несколькими записями - PullRequest
0 голосов
/ 05 марта 2020

У меня есть таблица сотрудников и другая таблица занятий. Данный работник может иметь одно или несколько занятий. Я хочу вернуть отношение работников, но присоединяюсь к их последней занятости, основываясь на created_at дате занятости.

Я поместил sqlfiddle на место: http://sqlfiddle.com/#! 17 / b0a3d / 2 но это основа c SQL, поэтому он возвращает одну строку для каждого сотрудника и данные о занятости для этого сотрудника, которые соответствуют их последней занятости.

ПРИМЕЧАНИЕ: sqlfiddle - это то, что я думаю о проблеме с точки зрения SQL, но на самом деле я хочу узнать, как это сделать с помощью Ruby на Rails. Как объединить Employee записи с Employment записями, но только с самой последней Employment записью. (надеюсь, это поможет уточнить).

Так что Employee.includes(:employments) в основном делает то, что делает sqlfiddle.

Мне нужно что-то более изворотливое, чтобы объединить данные о сотруднике и занятости (с последней занятостью).

Приветствую любые мысли.

Ответы [ 3 ]

0 голосов
/ 05 марта 2020

Достигает ли это того, чего вы хотите -

Employee.joins(:employments)
        .select(:id, :name, 'employments.created', 'employments.active')
        .order('employments.created_at desc')
0 голосов
/ 05 марта 2020

Сначала я найду MAX(created) каждой работы в таблице Employment по подзапросу, затем inner join результат с таблицей Employee.

subquery = """
SELECT employments.employee_id, MAX(created)
FROM employments
GROUP BY employments.employee_id
"""

Employee.joins("INNER JOIN (#{subquery}) AS t ON t.employee_id = employees.id")
0 голосов
/ 05 марта 2020

В Postgres вы можете использовать distinct on для решения этой проблемы топ-1 на группу:

select distinct on(e.id) e.id, e.name, m.created, m.active
from employees e
inner join employments m on m.employee_id = e.id;
order by e.id, m.created desc;

В ваша DB Fiddle , это производит:

id  name created    active
1   Dan  2019-10-23 false
2   Sam  2019-07-11 true
3   Joe  2019-03-13 false
...