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

关于ruby-on-rails - 如何使Active Record联接返回唯一对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15230568/

10-11 00:27
查看更多