Rails, количество пользователей, сгруппированных по дням созданной - PostgreSQL - PullRequest
0 голосов
/ 18 февраля 2019

Я использую Rails 5, PostgreSQL.Мне нужно получить количество пользователей, сгруппированных по дням созданного, используя postgres DATE_TRUNC.Условия - это пользователи, созданные в диапазоне дат и имеющие заказы в том же диапазоне дат.

Ниже приведен мой код, который приводит к ошибке 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: ERROR: функция date_trunc (неизвестно, неизвестно) не является уникальной

, и даже когда я явно пишу spree_users.created_at, я получаюта же ошибка.

Есть ли лучший способ для достижения требуемого или решения этой ошибки?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

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
0 голосов
/ 18 февраля 2019

Я думаю, что вы можете использовать функцию date из sql для получения поля даты и времени, а так как в таблице User и SpreeOrder есть поле create_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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...