sql yang dihasilkan oleh ekspresi bukanlah kueri yang valid, Anda mengelompokkan berdasarkan user_id
dan memilih banyak bidang lain berdasarkan itu tetapi tidak memberi tahu DB bagaimana seharusnya menggabungkan file lainnya. Misalnya, jika data Anda terlihat seperti ini:
a | b
---|---
1 | 1
1 | 2
2 | 3
Sekarang ketika Anda meminta db untuk mengelompokkan dengan a
dan juga mengembalikan b, ia tidak tahu cara menggabungkan nilai 1,2
. Anda perlu memberi tahu apakah perlu memilih min, maks, rata-rata, jumlah atau yang lainnya. Saat saya sedang menulis jawabannya, ada dua jawaban yang mungkin menjelaskan semua ini dengan lebih baik.
Dalam kasus penggunaan Anda, saya pikir Anda tidak ingin grup pada level db. Karena hanya ada 10 seni, Anda dapat mengelompokkannya dalam aplikasi Anda. Jangan gunakan metode ini dengan ribuan seni:
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: Pilih recent_arts, tetapi hanya satu seni per pengguna
Hanya untuk memberi Anda gambaran tentang sql (belum mengujinya karena saya tidak menginstal RDBMS di sistem saya)
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
Solusi ini didasarkan pada asumsi praktis, bahwa tidak ada dua seni untuk pengguna yang sama dapat memiliki create_at tertinggi yang sama, tetapi mungkin salah jika Anda mengimpor atau membuat sebagian besar seni secara terprogram. Jika asumsi tidak benar, sql mungkin menjadi lebih dibuat-buat.
EDIT: Coba ubah kueri menjadi 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])