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