查找使用ActiveRecord发出两个或更多订单的用户

时间:2017-06-02 10:09:08

标签: ruby-on-rails activerecord active-record-query

使用以下Rails模型:

    class User < ActiveRecord::Base
      has_many :orders
    end

    class Order < ActiveRecord::Base
      belongs_to :user
    end

我想要一个查找用户的查询:

  • 过去和同一查询中放置了2个或更多订单
  • 按月下订单的用户进行过滤

我试过这样的事情:

    start_date = 1.month.ago

    users = User.joins(:orders)
      .where('orders.created_at >= ?', start_date)
      .having('COUNT(orders.user_id) > 1')
      .group('orders.user_id')

但它没有用。请帮忙。我无法从文档中找到如何使用having子句,或者它是否是正确的方法。 如果您需要更多信息,请告诉我。谢谢!

更新:这是Rails生成的SQL查询:

    SELECT user_id 
    FROM "users" 
    INNER JOIN "orders" 
    ON "orders"."user_id" = "users"."id" 
    WHERE (orders.created_at >= '2017-05-02') 
    GROUP BY orders.user_id 
    HAVING COUNT(orders.user_id) > 1

1 个答案:

答案 0 :(得分:0)

您可以查询以查找过去订单超过2个的所有用户及其最新订单的created_at。然后选择最近订购了create_at不到一个月的用户。像这样:

repeat_users = User.joins(:orders).group("(users.id) having count(users.id) > 2").select("users.*", "max(orders.created_at) as last_order_time")

past_month_users = repeat_users.select{|user| user.last_order_time > Time.now - 1.month}