2012-01-15 56 views
0

我有2個型號:PurchaseUserUserhas_many :purchasesPurchasebelongs_to :user。我想選擇以下內容:ROR關係

有多少不同的用戶在過去3個月內進行過購買,也有一種打印他們電子郵件地址的方式('Purchase'有一個created_at字段)(我想這樣做使用控制檯)。對於如何從ruby的角度來看,我有點困惑(我可以做直接的SQL查詢,但我想弄清楚如何在Ruby中做到這一點)。

回答

0
Rails 2: Purchase.all(:conditions => ["created_at > ?", 3.months.ago]).user.uniq 

Rails 3: Purchase.where(:created_at > 3.months.ago).user.uniq 
+0

當我嘗試了。用戶的數組.uniq我得到:NoMethodError:未定義的方法'user'for#(Rails 2 btw) – execv 2012-01-15 20:27:54

+3

嘗試'Purchase.all(:conditions => [「created_at>?」,3.months.ago])。地圖(&:用戶).uniq' – 2012-01-15 20:56:08

-1

Purchase.where(:created_at > 3.months.ago).map(&:user).uniq

1
User.joins(:purchases).where("purchases.created_at > ?", 3.month.ago) 
To get distinct user list 
User.joins(:purchases).where("purchases.created_at > ?", 3.month.ago).uniq 
To get distinct collection of user emails 
User.joins(:purchases).where("purchases.created_at > ?", 3.month.ago).uniq.pluck(:email) 
0

它總是取決於數據結構和U需要多少記錄有。 如果這是在你的開發環境中的控制檯上做任何你喜歡的事情,否則好的sql查詢將會表現得更好。

  1. 選擇需要的字段,儘量使用pluck來獲取id。
  2. 使用這些ID做一個直接的查詢。 要做比較<>你將不得不使用sql。 如果您只需要電子郵件,請在查詢中添加一個選擇項,以便「從用戶中選擇電子郵件」;而不是'從用戶中選擇*'。

這樣:

User.joins(:purchases).where('purchases.created_at > ?', .month.ago).pluck('distinct(email)') 

將返回用戶的電子郵件

除此之外,具有u看一遍this?並試圖that?