我正在使用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,我也遇到同样的错误。
是否有更好的方法来实现此错误所需的解决方案?
答案 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
当我们的查询包含一个列名(可能属于多个表)时,会发生此错误。例如,我们有两个表User
和Company
,并且它们都有一个名为name
的列。现在,以下查询将引发与您面临的错误类似的错误:
User.joins(:companies).where("name = ABC")
之所以会发生这种情况,是因为我们没有指定要在其中搜索name
的表。因此,ActiveRecord
感到困惑,无法创建唯一的查询。
在上述情况下,可以通过在spree_users
和created_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