1

Ich habe zwei ModelleRails Geschäftszeiten Abfrage für aktiven Datensatz

OfficeTimeing < ActiveRecord::Base 
    belongs_to :office 
end 


Office < ActiveRecord::Base 
    has_many :office_timings 
end 

mit zwei Feldern opening_time und closing_time diese Felder String-Werte wie „09.00 Uhr“ habe ich eine Abfrage wollen, wie kann ich zur Zeit offenen Büros finden Ich will so etwas.

Office.joins(:office_timings).where("Datetime.now > office_timings.opening_time AND office_timings.closing_time > DateTime.now") 
+1

Ich weiß nicht, wie zwei mal als Zeichenfolge dargestellt zu vergleichen, ohne sie in Schienen in der Lage zu analysieren, aber zuerst müssen Sie als Ihre Öffnungs- und Schließzeiten in Sekunden Speicher (von Mitternacht gezählt) eher als Saiten? Auf diese Weise könnten Sie diese Abfrage problemlos schreiben. – hypern

+1

können Sie Ihren Kommentar in Ihre Antwort einfügen Ich werde dies –

Antwort

2

Ich weiß nicht, wie zwei mal als Zeichenfolge dargestellt zu vergleichen, ohne In der Lage, sie zuerst in Schienen zu analysieren, haben Sie jedoch in Erwägung gezogen, Ihre Öffnungs- und Schließzeiten in Sekunden (ab Mitternacht) anstatt in Strings zu speichern? Auf diese Weise könnten Sie diese Abfrage problemlos schreiben.

UPDATE: Ein paar nützliche Methoden, um dies zu erreichen.

Um die aktuellen Sekunden seit Mitternacht für eine bestimmte Zeit zu erhalten:

seconds = specific_time.seconds_since_midnight 

Um die Sekunden seit Mitternacht in ein Time-Objekt zu konvertieren:

time_instance = Time.at(seconds) 

Um einen String in Form von 09 zu produzieren : 00.00

time_instance.strftime("%I:%M %p") 

Details about Time class.

Details about strftime.

+0

akzeptieren es funktioniert dank –

1

Sie müssen Datetime.now in Ihre Abfrage injizieren ? mit:

Office.joins(:office_timings) 
    .where(
    "? > office_timings.opening_time AND office_timings.closing_time > ?", 
    Datetime.now, Datetime.now 
) 

Jeder ? wird sicher ersetzt durch die Argumente nach der Abfrage-String.

könnte Sie dies auch direkt in Postgres now() verwenden und machen die Bedingung ein wenig leichter BETWEEN mit lesen:

.where("now() BETWEEN office_timings.opening_time AND office_timings.closing_time") 
Verwandte Themen