У меня есть модель пользователя и модель карты. У пользователя много карточек, поэтому у карты есть атрибут user_id
.ActiveRecord возвращает самую новую запись для каждого пользователя (уникально)
Я хочу получить самую новую единственную Карту для каждого пользователя. Я был в состоянии сделать это:
Card.all.order(:user_id, :created_at)
# => gives me all the Cards, sorted by user_id then by created_at
Это заставляет меня половину пути туда, и я мог бы, конечно, перебирать эти строки и захватить первый для каждого пользователя. Но мне это очень плохо пахнет, так как я много делаю с помощью массивов в Ruby.
Я также могу это сделать:
Card.select('user_id, max(created_at)').group('user_id')
# => gives me user_id and created_at
... но я только получить обратно user_ids и created_at метки времени. Я не могу выбрать любые другие столбцы (включая идентификатор), поэтому то, что я получаю, бесполезно. Я также не понимаю, почему PG не позволит мне выбрать больше столбцов, чем указано выше, не помещая их в group_by или совокупную функцию.
Я бы предпочел найти способ получить то, что я хочу, используя только ActiveRecord. Я также хочу написать этот запрос в raw SQL, но я не могу сделать это с AR. BTW, я использую DB Postgres, который ограничивает некоторые из моих параметров.
Спасибо, ребята.
Как насчет 'Card.all.order (: user_id,: created_at) .first' или' Card.all.order (: user_id) .order (: created_at) .first' – Bala
@Bala Я хочу, чтобы самая новая карта за пользователь для всех пользователей, которые сделали Карту. Это дает мне самую последнюю карту для пользователя с самым низким идентификатором, у которого также есть как минимум одна карта. – gregb
Какой из них дал вам самый низкий идентификатор? просто добавьте ': desc' в': created_at' – Bala