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

我有一个简单的查询需求:查找自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位用户?

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

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

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

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

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

Rails从版本3.2.1开始添加了uniq所以现在你可以使用uniq

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