2014-04-28 10 views
5

Ich habe ein Event-Modell, das viele EventDates hat.Order-Modell nach Assoziationsattributen

Ein EventDate hat ein start_time Attribut und ein Event hat eine next_occurrence Methode, die das dazugehörige EventDate mit dem nächsten start_time findet.

Ich möchte die ersten 5 Veranstaltungen von next_occurrence bestellt (am ehesten zuerst).

Ich dachte, ich könnte in der Lage sein, die so etwas zu erreichen:

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

aber das ist nicht richtig - wenn ich die next_occurrence Daten dann sammeln sie betriebsbereit sind.

Wie könnte ich dies abfragen, um Ereignisse zurückgegeben von next_occurrence?

+0

am ehesten in dem Sinne, der zu diesem geraden Datum die nächstliegende "start_time" hat? – Pavan

+0

so bald wie in den Events mit dem nächsten ** first ** 'start_time' ihrer EventDates. – benjaminjosephw

+0

... Ich dachte, das wäre einfach. Vielleicht nicht? – benjaminjosephw

Antwort

2

Try this:

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) 

Erläuterung:

für jeden Event Finden Sie die nächste EventDate in der Zukunft

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

Behalten Sie nur die 5 zuerst durch die geordnete Ereignisse next_event_date

  .order(:next_event_date) 
     .limit(5) 

Wie ist, zurückkehren würde die Anforderung nur die event_id und die next_event_date, so dass die folgenden Zeilen eifrig Last und geben die Event Objekte

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

Dies ist hilfreich, um zu verstehen, wie man das angehen kann, aber ich bekomme 'undefinierte lokale Variable oder Methode' Ereignis 'für main: Object'. Wenn ich die Kartenmethode entferne bekomme ich 'Unbekannte Spalte 'next_event_date'' – benjaminjosephw

+0

@benjaminjosephw Es gab einen Tippfehler: Es ist' &: event' statt '& event'. Ich habe es repariert. 'map (&: event)' ist ein Synonym von 'map ({| o | o.event})' – Baldrick

+0

Oh ja, das hätte ich sehen sollen! Vielen Dank. Trotzdem: 'Unbekannte Spalte' next_event_date 'in' where clause'' – benjaminjosephw

1

Ich konnte das nicht ausprobieren, aber ich denke, es funktioniert. Sie findet die bevorstehenden Ereignisse in einer Unterabfrage, gibt Ihnen dann die erste 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

Ich habe das versucht, aber es gibt mir einen SQL-Syntaxfehler, den ich nicht ausarbeiten kann (ich bin kein SQL-Pro). – benjaminjosephw

Verwandte Themen