2012-01-15 44 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?