У меня есть простой запрос: найдите список пользователей, которые сделали заказ с 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
метод привяжет к запросу и предоставит вам список уникальных записей.
Ответ 3
Rails добавила uniq
с версии 3.2.1, так что теперь вы можете использовать uniq
http://apidock.com/rails/ActiveRecord/QueryMethods/uniq