2012-04-03 2 views
1

У меня есть модель публикации, и сообщение has_many: comments,: as =>: commentable (полиморфный). Я ищу способ, которым я могу получить все сообщения, и иметь виртуальный атрибут в записи, который покажет, сколько комментариев принадлежит этому сообщению.Как добавить виртуальный столбец «count» в запрос выбора в рельсах?

Я думал, что я мог бы просто сделать:

Post.select("posts.*, count(comments.id) as post_comments").joins(:comments) 

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

ответ

3

Я думаю, проблема в том, что ваш count(comments.id) просто делает один подсчет для всей объединенной таблицы. Вы можете обойти эту проблему с помощью вложенного запроса:

Post.select("posts.*, (SELECT count(comments.id) FROM comments WHERE comments.post_id=posts.id) AS post_comments") 

Вам не нужно объединения в этом случае, так как таблица комментариев не используется во внешнем запросе.

+0

это прекрасно – nathanengineer

-1

Я бы сделал это с переменными в модели Post. 1-й я попытался бы найти сообщение, которое я как-то искал (вы можете найти его с помощью параметра wichever, который вы хотите, ниже я покажу пример с поиском id param).

@post = Post.find(params[:id]) 

Когда вы найдете пост, который вы искали, выясняя комментарий число является Preety легко, попробуйте что-то вдоль линий ...

@comments = @post.comments.size 

... которым будет возвращать целое число.

5

Фактически, вам не хватает группового предложения. Вам нужно группировать по сайту, иначе агрегация count() сводит все к одной записи, как вы видите.

Попробуйте это:

Post.select("posts.*, count(comments.id) as post_comments") 
    .joins(:comments) 
    .group('posts.id') 
Смежные вопросы