SQL, сгенерированный выражением, не является допустимым запросом, вы группируете по user_id
и выбираете множество других полей на основе этого, но не указываете БД, как следует агрегировать другие поля. Например, если ваши данные выглядят так:
a | b
---|---
1 | 1
1 | 2
2 | 3
Теперь, когда вы просите db сгруппировать по a
и также вернуть b, он не знает, как агрегировать значения 1,2
. Вы должны сказать, нужно ли выбирать минимальное, максимальное, среднее, сумму или что-то еще. Когда я писал ответ, было два ответа, которые могли бы объяснить все это лучше.
В вашем случае, я думаю, вы не хотите группировать на уровне БД. Поскольку существует всего 10 искусств, вы можете сгруппировать их в своем приложении. Не используйте этот метод с тысячами искусств, хотя:
arts = Art.all(:order => "created_at desc", :limit => 10)
grouped_arts = arts.group_by {|art| art.user_id}
# now you have a hash with following structure in grouped_arts
# {
# user_id1 => [art1, art4],
# user_id2 => [art3],
# user_id3 => [art5],
# ....
# }
РЕДАКТИРОВАТЬ: Выберите последние_арты, но только один рисунок на пользователя
Просто для того, чтобы дать вам представление о SQL (не тестировал его, так как в моей системе не установлено СУБД)
SELECT arts.* FROM arts
WHERE (arts.user_id, arts.created_at) IN
(SELECT user_id, MAX(created_at) FROM arts
GROUP BY user_id
ORDER BY MAX(created_at) DESC
LIMIT 10)
ORDER BY created_at DESC
LIMIT 10
Это решение основано на практическом предположении, что никакие два искусства для одного и того же пользователя не могут иметь одинаковый наивысший созданный_кат, но это может быть неправильно, если вы импортируете или программно создаете большую часть искусств. Если предположение не выполняется, sql может стать более надуманным.
РЕДАКТИРОВАТЬ: Попытка изменить запрос на Arel:
Art.where("(arts.user_id, arts.created_at) IN
(SELECT user_id, MAX(created_at) FROM arts
GROUP BY user_id
ORDER BY MAX(created_at) DESC
LIMIT 10)").
order("created_at DESC").
page(params[:page]).
per(params[:per])