Как активировать Active Record для возврата уникальных объектов?

У меня есть простой запрос: найдите список пользователей, которые сделали заказ с 1 января 2013 года.

В SQL это очень простой запрос.

Но я использую Rails и Active Record.

Поэтому я написал: User.joins(:orders).where("orders.created_at >= '2013-01-01 00:00:00'")

В нашей базе данных у нас есть 100 заказов, сделанных с 01.01.2012 на 75 пользователей. (Некоторые пользователи сделали несколько порядков.)

Однако вышеприведенное выражение возвращает 100 пользователей. (Должны быть дубликаты.)

Я попробовал User.joins(:orders).where("orders.created_at >= '2013-01-01 00:00:00'").uniq

Это тоже не работает.

Как я могу получить 75 пользователей, которые сделали заказ с 01.01.2012?

Ответ 1

@dbjohn имеет правильную идею, но я предполагаю, что вы хотите избежать создания дополнительных объектов. Вот небольшой вариант его решения, позволяющий базе данных сделать uniq-ing для вас:

date = "2013-01-01 00:00:00"
User.joins(:orders).where("orders.created_at >= ?", date).distinct

Обратите внимание, что вы можете изменить порядок методов, чтобы они соответствовали тому, что вы считаете наиболее семантическим, и ActiveRecord будет писать для вас тот же SQL.

Ответ 2

User.joins(:orders).
    where("orders.created_at >= '2013-01-01 00:00:00'").
    group('users.id')

group метод привяжет к запросу и предоставит вам список уникальных записей.