SQL'en genereret af udtrykket er ikke en gyldig forespørgsel. Du grupperer efter user_id
og vælge en masse andre felter baseret på det, men ikke fortælle DB, hvordan den skal samle de andre filer. For eksempel, hvis dine data ser sådan ud:
a | b
---|---
1 | 1
1 | 2
2 | 3
Når du nu beder db om at gruppere efter a
og returnerer også b, den ved ikke, hvordan man aggregerer værdierne 1,2
. Du skal fortælle om den skal vælge min, max, gennemsnit, sum eller noget andet. Lige da jeg skrev svaret, har der været to svar, som måske forklarer alt dette bedre.
I dit tilfælde tror jeg dog, at du ikke vil have en gruppe på db-niveau. Da der kun er 10 kunster, kan du gruppere dem i din ansøgning. Brug dog ikke denne metode med tusindvis af kunst:
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],
# ....
# }
EDIT: Vælg nyeste_kunst, men kun én kunst pr. bruger
Bare for at give dig ideen om sql (har ikke testet det, da jeg ikke har RDBMS installeret på mit system)
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
Denne løsning er baseret på den praktiske antagelse, at ikke to kunster for samme bruger kan have samme højeste create_at, men det kan meget vel være forkert, hvis du importerer eller programmerer hovedparten af kunst. Hvis antagelsen ikke holder stik, kan sql blive mere konstrueret.
EDIT: Forsøg på at ændre forespørgslen til 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])