В моем приложении Rails я разрешаю пользователям «голосовать» за события. Некоторые события - это только одна конкретная дата, и некоторые события продолжаются.Rails & ActiveRecord: сложный SQL-запрос
Я пытаюсь построить запрос, который отображает все события, которые либо A) пользователь имеет не на голосование ИЛИ В) текущих событий пользователь проголосовал на над 1 месяц назад.
Событие имеет «текущую» булевскую колонку. Событие has_many голосов. И пользователь has_many голосов.
Это мой запрос, чтобы получить все события у пользователя не проголосовали. Оно работает.
scope :unvoted, ->(user_id) {
joins(
"LEFT OUTER JOIN votes ON votes.event_id = events.id AND " +
"votes.user_id = #{user_id}"
).where("votes.id IS NULL")
}
Я пытаюсь добавить или часть запроса. Мне нужно включить «текущие» события, которые пользователь проголосовал более месяца назад. Вот что я пробовал:
scope :unvoted, ->(user_id) {
joins(
"LEFT OUTER JOIN votes ON votes.event_id = events.id AND " +
"votes.user_id = #{user_id}"
)
.where(
"votes.id IS NULL OR events.ongoing = ? AND MAX(votes.created_at) < ?", true, 1.month.ago
)
}
Но это дает мне ошибку:
PG::GroupingError: ERROR: aggregate functions are not allowed in WHERE
Так что я попытался это:
scope :unvoted, ->(user_id) {
joins(
"LEFT OUTER JOIN votes ON votes.event_id = events.id AND " +
"votes.user_id = #{user_id}"
).
having('votes.id IS NULL OR events.ongoing = ? AND MAX("votes"."created_at") < ?', true, 1.month.ago).
group("events.id")
}
Но это дает мне ошибку:
ERROR: column must appear in the GROUP BY clause or be used in an aggregate function
Каков правильный запрос, который я ищу для?
Для сложных вопросов SQL убедитесь, маркировать их с СУРБД и создать хороший пример таблиц и ожидаемого результата. Есть гораздо больше последователей для тегов postgres и mysql, чем, например, ruby-on-rails, и вы, как правило, получаете более качественные ответы. – max
Какова ваша цель использования MAX? Просто получить последнюю версию из сопоставленных записей или заказать записи от нового до старого? – YTorii
@YTorii Мне нужно получить последнюю из сопоставленных записей, чтобы узнать, было ли это создано за месяц назад –