2012-07-16 12 views
5

मैं पदों को दिखाने में सक्षम होना चाहता हूं और उन्हें दो मानदंडों द्वारा क्रमबद्ध करना चाहता हूं, पहले उनके पास उनके द्वारा किए गए वोटों की संख्या और दूसरी तारीख के आधार पर उन्हें बनाया गया था। मैं उन पदों को नहीं चाहता जो एक हफ्ते से अधिक पुरानी हो, इसलिए पिछले सप्ताह में केवल पोस्ट ही प्रदर्शित हों। मैं यह कर की कोशिश की:पिछले हफ्ते में बनाए गए केवल पोस्ट दिखाएं

<%= render @posts.sort_by { |post| post.votes.count if post.created_at < 1.week.ago.utc }.reverse %> 

लेकिन यह मुझे 2 के साथ NilClass की तुलना की एक त्रुटि दिया

में विफल रहा है मैं कोड वोट गिनती द्वारा बस छँटाई पदों से काम करता है लेकिन मैं यह भी समय सीमित करने के लिए इतना कर सकता है चाहता हूँ कोई मुझे बताता है कि यह कैसे किया जा सकता है। मैं सादगी के लिए अभी भी बहुत खेद है।

+0

मुझे लगता है कि मुझे सप्ताह की तुलना में पुरानी पोस्ट दिखाने की स्थिति पोस्ट नहीं की जानी चाहिए। Post.created_at> 1.week.ago.utc। और nilClass त्रुटि हो सकती है क्योंकि आपकी क्वेरी में पहुंचने का प्रयास करने वाली कुछ चीज़ डीबी में मौजूद नहीं है –

उत्तर

9

समाधान में

निम्नलिखित की तरह कुछ करना चाहिए ठीक है, लेकिन मैं counter_cache स्तंभ (http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html) और recent_post कोड बदल रहा है (इस टिप्पणी से: https://stackoverflow.com/a/11498634/1392074) जोड़ने का सुझाव में :

def self.recent_posts 
    Post.where("created_at >= ?", 1.week.ago.utc).order("votes_count DESC, created_at DESC") 
end 
2

पदों को खोजने के लिए कोड मॉडल में होना चाहिए और दृश्यों पर नहीं होना चाहिए। हमेशा एक अच्छा विचार है कि आपको उन रिकॉर्ड्स को प्राप्त करना चाहिए जिन्हें हमें रिकॉर्ड लाने और इसे देखने के बजाय प्रदर्शित करने की आवश्यकता है। आप @Salil करके अपने post.rb

def self.recent_posts 
    Post.select("p.*, COUNT(v.id) AS count").where("post.created_at >= 1.week.ago.utc").joins("p LEFT JOIN votes v on p.id=v.post_id").order("count, created_at DESC") 
end 
संबंधित मुद्दे