Rails,按created_at天分组的用户数-PostgreSQL

时间:2019-02-18 12:19:01

标签: ruby-on-rails ruby postgresql activerecord

我正在使用Rails 5,PostgreSQL。我需要使用postgres DATE_TRUNC获取按created_at天分组的用户数。 条件是在日期范围内创建的用户,并且订单在同一日期范围内。

下面是我的代码,导致AmbiguousFunction错误

Spree::User.joins(:orders)
           .where(spree_orders: { completed_at: params[:start_date]..params[:end_date] })
           .order("DATE_TRUNC('day', 'created_at')")
           .group("DATE_TRUNC('day', 'created_at')")
           .count

start_date和end_date的参数如下:

params[:end_date] = Time.current.end_of_day
params[:start_date] = (Time.current - 200.days).beginning_of_day

我收到以下错误

  

ActiveRecord :: StatementInvalid:PG :: AmbiguousFunction:错误:函数date_trunc(未知,未知)不是唯一

即使我显式地写了spree_users.created_at,我也遇到同样的错误。

是否有更好的方法来实现此错误所需的解决方案?

2 个答案:

答案 0 :(得分:1)

我认为您可以使用sql中的date函数来获取时间戳字段的日期,并且由于表User和SpreeOrder具有created_at字段,因此您应该告知表名称(spree_orders.created_at)

Spree::User.joins(:orders)
  .where(spree_orders: { completed_at: params[:start_date]..params[:end_date]})
  .order("date(spree_orders.created_at)")
  .group("date(spree_orders.created_at)")
  .count

答案 1 :(得分:1)

  

ActiveRecord :: StatementInvalid:PG :: AmbiguousFunction

当我们的查询包含一个列名(可能属于多个表)时,会发生此错误。例如,我们有两个表UserCompany,并且它们都有一个名为name的列。现在,以下查询将引发与您面临的错误类似的错误:

User.joins(:companies).where("name = ABC")

之所以会发生这种情况,是因为我们没有指定要在其中搜索name的表。因此,ActiveRecord感到困惑,无法创建唯一的查询。
在上述情况下,可以通过在spree_userscreated_at查询中使用order列名称group来简单地解决错误:

Spree::User.joins(:orders)
       .where(spree_orders: { completed_at: params[:start_date]..params[:end_date] })
       .order("DATE_TRUNC('day', 'spree_users.created_at')")
       .group("DATE_TRUNC('day', 'spree_users.created_at')")
       .count