2014-04-28 32 views
5

Birçok EventDates'e sahip bir Event modelim var.İlişkilendirme öznitelikleriylepiraf modeli

Bir EventDate öğesi, bir start_time özniteliğine sahiptir ve bir Olay, kendisine ait olan EventDate'i en yakın start_time ile bulan bir next_occurrence yöntemine sahiptir.

next_occurrence tarafından sipariş edilen ilk 5 Etkinliği (en kısa zamanda önce) bulmak istiyorum.

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

ama bu doğru değil - O zaman next_occurrence tarihleri ​​toplamak, onlar bozuk şunlardır:

ben böyle bir şey ile ulaşmak mümkün olabileceğini düşündüm.

Bunu, next_occurrence tarafından sipariş edilen Olayları iade etmek için nasıl sorgulayabilirim?

+0

erken Bu tarihe en yakın 'start_time' olan anlamda? – Pavan

+0

En yakın Etkinliklerde olduğu gibi en yakın ** ilk ** 'start_time' kendi EventDates. – benjaminjosephw

+0

... Bunun kolay olacağını düşündüm. Belki de değil? – benjaminjosephw

cevap

2

verir gelecekteki

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

Event nesneleri Olduğu gibi isteği yalnızca event_id ve next_event_date, bu nedenle aşağıdaki satırları istekli yükü dönecekti next_event_date

  .order(:next_event_date) 
     .limit(5) 

tarafından sipariş sadece 5 birinci olayları tutun ve dönüş

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

Bu, buna nasıl yaklaşılacağını anlamak için yararlıdır; ancak, ana: Object' için undefined local variable veya method 'event' alıyorum. Harita yöntemini kaldırırsam, "Bilinmeyen sütun aldım" next_event_date ' – benjaminjosephw

+0

@benjaminjosephw Bir yazım hatası vardı:' & event 'yerine '&: olayı'. Onardım. 'map (&: event)', 'map ({| o | o.event})' – Baldrick

+0

Oh'un bir eşanlamlısıdır, evet, onu fark etmeliydim! Teşekkürler. Yine de şunu elde ediyorum: 'Bilinmeyen sütun 'next_event_date' in 'where clause' ' – benjaminjosephw

1

Bunu deneyemedim, ama işe yarıyor.

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) 

Açıklama:

her Event yakın EventDate için bul Bu deneyin ardından, bir alt sorguda yaklaşan etkinlikler bulur seni ilk 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

Bunu denedim ama bana çalışamayacağım bir SQL sözdizimi hatası veriyor (SQL pro değil). – benjaminjosephw

İlgili konular