ActiveRecord: группировка с включениями

#ruby-on-rails #rails-activerecord

#ruby-on-rails #рельсы-activerecord

Вопрос:

У меня есть 3 модели: Location, UserReview, ContactDetail

Местоположение имеет много пользовательских просмотров и много контактных данных

Я хочу выбрать все местоположения, где в местоположении 0 contact_details и упорядочить их в порядке убывания по последнему созданному user_review.

Я могу выбрать все местоположения с 0 contact_details следующим образом:

 Location
  .includes(:contact_details)
  .where(contact_details: { location_id: nil } )
  

Я могу упорядочить все местоположения по последнему созданному user_review следующим образом:

 Location
  .left_joins(:user_reviews)
  .group('locations.id')
  .order('MAX(user_reviews.created_at) DESC')
  

У меня возникли проблемы с объединением этих 2 запросов. Это выдает ошибку:

 Location
  .includes(:contact_details)
  .where(contact_details: { location_id: nil } )
  .left_joins(:user_reviews)
  .group('locations.id')
  .order('MAX(user_reviews.created_at) DESC')
  

Ошибка:

 PG::GroupingError: ERROR:  column "contact_details.id" must appear in the GROUP BY clause or be used in an aggregate function
  

Как правильно объединить эти запросы?

Ответ №1:

includes попытается создать LEFT OUTER JOIN with contact_details при наличии предложения where, используйте join вместо:

  Location
  .left_outer_joins(:contact_details)
  .left_joins(:user_reviews)
  .group('locations.id')
  .having('COUNT(contact_details.id) = 0')
  .order('MAX(user_reviews.created_at) DESC')
  

Ссылка:

Руководство по Rails

Комментарии:

1. В этом есть смысл. Спасибо!