Rails Query Issue - PullRequest
       8

Rails Query Issue

0 голосов
/ 12 мая 2011

У меня есть фотографии с комментариями.

Я хочу выбрать любые фотографии с недавними комментариями и отображать эти фотографии в виде «временной шкалы», где самая последняя закомментированная фотография находится вверху, а остальные фотографии опускаются ниже.

Я попробовал это, и он работал на SQLite:

@photos = Photo.select('DISTINCT photos.*').joins(:comments).order('comments.created_at DESC')

Однако тестирование на PostgreSQL вызывает эту ошибку:

PGError: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list
\n: SELECT DISTINCT photos.* FROM \"photos\" INNER JOIN \"comments\" ON \...

Итак, проблема в том, что я выбираю фотографии, но упорядочиваю по актуальности комментариев ... и Postgre это не нравится.

Может кто-нибудь предложить либо:

A: Как я могу исправить этот запрос ...

или

Б: Другой способ получения фотографий по актуальности их комментариев?

Важная причина, по которой я делаю это таким образом, а не с помощью модели комментариев, заключается в том, что я хочу показать каждую фотографию один раз с любыми последними комментариями рядом с ней, а не показывать каждый комментарий сам по себе, когда одни и те же фотографии появляются несколько раз.

Спасибо!

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Проверьте параметр: touch для ассоциации own_to:

: touch

Если true, то связанный объект будет затронут (атрибуты updated_at / on установлены сейчас) когда эта запись либо сохранена, либо уничтожена.Если вы укажете символ, этот атрибут будет обновляться с текущим временем вместо атрибута updated_at / on.

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to

Поэтому в вашей модели комментариев вы быhave:

belongs_to :photo, :touch => :comments_updated_at

Теперь, чтобы создать временную шкалу фотографий с недавно обновленными комментариями, все, что вам нужно сделать, это:

Photo.order('comments_updated_at DESC').all 

Просто добавьте "comments_updated_at"поле даты и времени для вашей фотомодели.

Имеет смысл?

0 голосов
/ 16 августа 2017

Только для будущих читателей этого вопроса реальный ответ на вашу SQL проблему в SQlite vs Postgresql заключается в том, что в «стандарте» SQL каждый выбранный столбец должен находиться в GROUP BY или бытьстатистическая функция.

https://www.techonthenet.com/sql/group_by.php (или любая другая ссылка на SQL, на которую вы хотите взглянуть)

В вашем запросе SQLite вместо конкретных столбцов использовалось SELECT *.Это привело бы к подобной ошибке в большинстве баз данных, таких как Postgresql (MySQL, Мария, возможно, MSSQL Server).Это определенно недопустимая грамматика SQL по многим причинам.

Под капотом я понятия не имею, что делает SQlite - может быть, он расширяет * в поля и добавляет их в GROUP BY под капотом?Но это не очень хороший SQL-оператор, который выдает ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...