ActiveRecord способ сортировки группы перед заказом - PullRequest
2 голосов
/ 18 марта 2011

У меня есть запрос на активную запись:

@reviews = Review.limit(30).group('user_id').order('created_at desc')

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

Я понимаю, что группирование происходит перед заказом, поэтому можно ли как-то отсортировать группу перед вызовом заказа?

Ответы [ 2 ]

0 голосов
/ 02 июля 2015

Я нашел много ответов на этот вопрос, но каждый из них требует простого SQL, когда у вас есть простой запрос, вы можете использовать его, для вашего ввода это будет примерно так:

Review.find_by_sql(
 "SELECT * FROM (
 SELECT * FROM reviews
 ORDER BY reviews.created_at DESC ) as my_table
 group by my_table.user_id
 LIMIT 30"
)

, но если запросболее сложный и требует больше объединений, чем вы можете использовать почти хорошее решение, упомянутое ранее, я не уверен, что это лучшее решение, но оно работает для меня:

ids = Review.order('created_at DESC').pluck(:id)
@reviews = Review.where(id: ids).group(:user_id).limit(30)

edit: Да, последнее решение неверно, потому что оно выполняет два запроса к БД.Я случайно вернулся к этой проблеме сегодня, и я использовал метод to_sql (поставляется с> Rails 3.0) вместе с первым решением, для меня оно идеально - 1. все еще один запрос, 2. подзапрос может быть таким же сложным, как и вы.желание и читабельность кода останутся прежними:

Review.find_by_sql(
     "SELECT * FROM (
     #{ Review.order(:created_at).to_sql }
     ) as my_table
     group by my_table.user_id
     LIMIT 30"
    )
0 голосов
/ 18 марта 2011
ids = Review.group(:user_id).maximum(:created_at).keys
@reviews = Review.limit(30).where(:id => ids).order(:created_at)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...