#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')
Ссылка:
Комментарии:
1. В этом есть смысл. Спасибо!