ROR关系

时间:2012-01-15 20:03:56

标签: ruby-on-rails ruby

我有2个模型:PurchaseUserUser has_many :purchasesPurchase belongs_to :user。我想选择以下内容:

在过去3个月中有多少不同的用户购买了,还有一种打印他们的电子邮件地址的方式('Purchase'有一个created_at字段)(我想使用控制台执行此操作)。关于如何从红宝石的角度来看,我有点困惑(我可以做直接的SQL查询,但我想知道如何在Ruby中做到这一点)。

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

它总是取决于数据结构和你将拥有多少记录。 如果在你的开发环境中的控制台中做了你喜欢的任何事情,否则好的SQL查询会表现得更好。

  1. 选择所需的字段,尽可能使用pluck来获取ID。
  2. 使用这些ID进行直接查询。 做比较<>你将不得不使用SQL。 如果您只需要电子邮件,请在查询中添加一个选择,这样您就可以从用户那里选择电子邮件;'而不是“从用户中选择*”。
  3. 这样:

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

    将为您返回一系列用户'电子邮件

    除此之外,您还要阅读this?并尝试that?

答案 3 :(得分:-1)

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