2013-03-05 72 views
25

我有一個簡單的查詢需求:查找自2013年1月1日以來訂購的用戶列表。如何使活動記錄連接返回唯一對象?

在SQL中,這是一個非常簡單的查詢。

但我使用的是Rails和Active Record。

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

在我們的數據庫,我們必須通過75個用戶自2013年1月1日取得100個訂單。 (有些用戶明顯地做出了多個訂單)。

但是,上述表達式返回100個用戶。 (必須有重複。)

我試圖User.joins(:orders).where("orders.created_at >= '2013-01-01 00:00:00'").uniq

,不能正常工作。

如何獲得自2013年1月1日以來訂購的75位用戶?

+2

如果你試圖鏈'選擇( 「DISTINCT(users.id)」)'或'組(「users.id」)' – 2013-03-05 17:53:00

+0

您在'User'和'Order'模型中定義了關係嗎?沒有必要使用原生sql – ant 2013-03-05 17:58:50

+0

是的,我在User和Order模型之間建立了關係。 – 2013-03-05 18:03:03

回答

28

@dbjohn有正確的想法,但我認爲你想避免創建額外的對象。這裏有他的解決方案有輕微變形,讓數據庫做的uniq-ING爲您提供:

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

請注意,您可以重新排列的方法,以適應任何你認爲最語義和ActiveRecord的會寫相同SQL爲你。

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

group方法將鏈接到查詢併爲您提供唯一記錄列表。