Я нашел много ответов на этот вопрос, но каждый из них требует простого 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"
)