व्यंजक द्वारा उत्पन्न sql मान्य क्वेरी नहीं है, आप user_id
. द्वारा समूहीकृत कर रहे हैं और उसके आधार पर कई अन्य क्षेत्रों का चयन करना, लेकिन डीबी को यह नहीं बताना कि उसे अन्य फाइलों को कैसे एकत्रित करना चाहिए। उदाहरण के लिए, यदि आपका डेटा इस तरह दिखता है:
a | b
---|---
1 | 1
1 | 2
2 | 3
अब जब आप db को a
. द्वारा ग्रुप करने के लिए कहते हैं और बी भी लौटाता है, यह नहीं जानता कि मूल्यों को कैसे एकत्रित किया जाए 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],
# ....
# }
संपादित करें: latest_arts चुनें, लेकिन प्रति उपयोगकर्ता केवल एक कला
बस आपको sql का विचार देने के लिए (इसका परीक्षण नहीं किया है क्योंकि मेरे सिस्टम पर RDBMS स्थापित नहीं है)
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
यह समाधान व्यावहारिक धारणा पर आधारित है, कि एक ही उपयोगकर्ता के लिए दो कलाओं में समान उच्चतम निर्मित_एट नहीं हो सकते हैं, लेकिन यह गलत हो सकता है यदि आप बड़ी मात्रा में कलाओं का आयात या प्रोग्रामिक रूप से निर्माण कर रहे हैं। अगर धारणा सच नहीं होती है, तो एसक्यूएल अधिक विकसित हो सकता है।
संपादित करें: क्वेरी को 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])