2014-04-28 8 views
5

मेरे पास एक इवेंट मॉडल है जिसमें कई इवेंटडेट हैं।एसोसिएशन विशेषताओं द्वारा ऑर्डर मॉडल

एक इवेंटडेट में start_time विशेषता है और एक ईवेंट में next_occurrence विधि है जो इवेंटडेट को निकटतम start_time से संबंधित करती है।

मैं next_occurrence (जल्द से जल्द पहले) द्वारा आदेशित पहली 5 घटनाओं को ढूंढना चाहता हूं।

मैंने सोचा था कि मुझे लगता है कि प्राप्त करने के लिए कुछ इस तरह से सक्षम हो सकता है:

Event.joins(:event_dates).order('event_dates.start_time').limit(5) 

लेकिन यह सही नहीं है - अगर मैं तो next_occurrence दिनांकों एकत्रित करते हैं, वे क्रम से बाहर हैं।

next_occurrence द्वारा आदेशित घटनाओं को वापस करने के लिए मैं यह कैसे पूछ सकता हूं?

+0

soonest इस अर्थ में जिसकी तारीख अभी तक 'start_time' है? – Pavan

+0

जल्द ही घटनाक्रमों के साथ निकटतम ** पहले ** 'event_time' उनके ईवेंटडेट्स के साथ। – benjaminjosephw

+0

... मैंने सोचा कि यह आसान होगा। शायद नहीं? – benjaminjosephw

उत्तर

2

देता है इस प्रयास करें:

next_5_events = EventDate.select('event_id, min(date) as next_event_date') 
         .includes(:event) 
         .where('next_event_date > ?', Time.now) 
         .group(:event_id) 
         .order(:next_event_date) 
         .limit(5) 
         .map(&:event) 

स्पष्टीकरण:

प्रत्येक Event निकटतम EventDate में के लिए खोजें भविष्य

EventDate.select('event_id, min(date) as next_event_date') 
     .where('next_event_date > ?', Time.now) 
     .group(:event_id) 

केवल 5 पहला घटनाओं next_event_date

  .order(:next_event_date) 
     .limit(5) 

द्वारा आदेश दिए जाने है, अनुरोध केवल event_id और next_event_date, तो निम्नलिखित लाइनों उत्सुक लोड वापसी होगी रखें और Event वस्तुओं लौट

  .includes(:event) 
     .map(&:event) 
+0

यह समझने में मददगार है कि इसे कैसे पहुंचाया जाए, लेकिन मुझे मुख्य के लिए 'अपरिभाषित स्थानीय चर या विधि' ईवेंट 'मिल रहा है: ऑब्जेक्ट'। यदि मैं नक्शा विधि को हटाता हूं तो मुझे 'अज्ञात कॉलम' मिलता है अगला_एवेंट_डेट ' – benjaminjosephw

+0

@benjaminjosephw एक टाइपो था: यह '& event' के बजाय' &: event' है। मैंने ठीक कर दिया। 'नक्शा (और: घटना) 'मानचित्र का एक सारांश है ({| o | o.event})' – Baldrick

+0

ओह हाँ, मुझे यह देखना चाहिए था! धन्यवाद। फिर भी यह प्राप्त हो रहा है: 'अज्ञात कॉलम' next_event_date 'जिसमें' खंड ' – benjaminjosephw

1

मैं इसे आजमा नहीं सकता था, लेकिन मुझे लगता है कि यह काम करता है। यह एक सबक्वेरी में आने वाली घटनाओं से पता चलता है, तो आप पहले 5.

Event.joins("(
    select event_dates.event_id, max(start_time) 
    from event_dates 
    group by event_dates.event_id 
    order by max(start_time) desc 
) as upcoming_events on events.id = upcoming_events.event_id") 
.limit(5) 
+0

पोस्ट करें मैंने कोशिश की लेकिन यह मुझे एक SQL वाक्यविन्यास त्रुटि देता है जिसे मैं काम नहीं कर सकता (मैं एक एसक्यूएल समर्थक नहीं हूं)। – benjaminjosephw

संबंधित मुद्दे