2016-08-09 39 views
0

Ich mache eine Sport-Anwendung mit Ligen und Veranstaltungen, enthalten die Ereignisse eine league_id, die Ligen haben eine name und eine country_name. Wie kann ich heute alle Veranstaltungen mit Startdatum zusammen mit dem Namen und Land der Liga bekommen?Join mit Where-Klausel, die bestimmte Datensätze filtert, Schienen aktiven Datensatz

Ich habe versucht:

League.joins(:events).where(events: {event_start: Time.zone.now..Time.zone.now.end_of_day}) 

Aber das gibt alle Ligen, die ein Ereignis heute haben, wenn ich dann die Ereignisse aus dieser spezifischen Liga zugreifen versuchen, alle Ereignisse enthalten sind, und nicht nur diejenigen, die sind heute kariert sein.

Antwort

2

Beginnen Sie mit Event s und schließen Sie relevante League ein, um N + 1 Problem zu vermeiden.

Event.includes(:league).where(event_start: Time.zone.now..Time.zone.now.end_of_day) 
+0

Dies funktioniert auf end_of_day, danke! Das Problem ist jedoch, dass ich jetzt nicht in der hierarchischen Struktur, die ich möchte (iterieren über Ligen, als Ereignisse) Ich habe nur folgendes geschrieben, um das zu lösen: 'events = Event.includes (: league) .where (event_start : Time.zone.now..Time.zone.now.end_of_day) events_hash = {} events.each do | event | \t events_hash [event.league.group] || = {} \t events_hash [event.league.group] [event.league.name] || = [] \t events_hash [event.league.group] [Ereignis. liga.name] << event ende events_hash' Gibt es eine offensichtlich elegantere Möglichkeit, dies zu tun? (Sorry für die Formatierung) – Reinier

1

Um mit Starttermin heute die ganze Veranstaltung zu bekommen, ich glaube, Sie zwischen beginning_of_day suchen müssen

Event.includes(:league).where(event_start: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day) 

oder

Event.includes(:league).where("event_start >= ? && event_start <= ?", Time.zone.now.beginning_of_day, Time.zone.now.end_of_day)