如何使Active Record连接返回唯一对象?

时间:2013-03-05 17:43:40

标签: ruby-on-rails activerecord

我有一个简单的查询需求:查找自2013年1月1日起订购的用户列表。

在SQL中,这是一个非常简单的查询。

但我正在使用Rails和Active Record。

所以我写道:User.joins(:orders).where("orders.created_at >= '2013-01-01 00:00:00'")

在我们的数据库中,我们自2013年1月1日起有75个用户发出100个订单。 (显然,有些用户制作了多个订单。)

但是,上面的表达式返回100个用户。 (必须有重复。)

我尝试了User.joins(:orders).where("orders.created_at >= '2013-01-01 00:00:00'").uniq

这也不起作用。

如何获得自2013年1月1日起订购的75位用户?

3 个答案:

答案 0 :(得分:39)

@dbjohn有正确的想法,但我认为你想避免创建额外的对象。这是他的解决方案的一个轻微变体,让数据库为您完成任务:

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

请注意,您可以重新排列方法的顺序以适合您认为最具语义性的方法,ActiveRecord将为您编写相同的SQL。

答案 1 :(得分:9)

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

group方法将链接到查询并为您提供唯一记录列表。

答案 2 :(得分:-1)

自版本3.2.1起,Rails已添加uniq 所以现在你可以使用uniq

http://apidock.com/rails/ActiveRecord/QueryMethods/uniq