Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie erstelle ich das Modul „Anstehende Geburtstage“ in Rails?

Mehrere Antworten haben vorgeschlagen, den Tag des Jahres zu berechnen/speichern und Sortieren danach, aber das allein wird nicht viel nützen, wenn Sie sich dem Ende des Jahres nähern und Menschen mit Geburtstagen zu Beginn des nächsten Jahres berücksichtigen müssen.

Ich würde mich für eine Lösung entscheiden, bei der Sie das vollständige Datum (Jahr, Monat, Tag) des nächsten Geburtstages jeder Person berechnen , dann sortiere danach. Sie können dies in Ruby-Code tun oder eine gespeicherte Prozedur in der Datenbank verwenden. Letzteres ist schneller, erschwert jedoch die spätere Migration Ihrer App auf eine andere DB-Plattform.

Es wäre vernünftig, diese Liste der bevorstehenden Geburtstage nur einmal pro Tag zu aktualisieren, was bedeutet, dass Sie eine Form von Caching verwenden können. Daher ist die Geschwindigkeit der benötigten Abfrage/des benötigten Codes weniger problematisch, und so etwas sollte gut funktionieren, solange Sie das Ergebnis zwischenspeichern:

class User
  def next_birthday
    year = Date.today.year
    mmdd = date_of_birth.strftime('%m%d')
    year += 1 if mmdd < Date.today.strftime('%m%d')
    mmdd = '0301' if mmdd == '0229' && !Date.parse("#{year}0101").leap?
    return Date.parse("#{year}#{mmdd}")
  end
end

users = User.find(:all, :select => 'id, date_of_birth').sort_by(&:next_birthday).first(5)

Bearbeiten :Korrigiert, um korrekt mit Schaltjahren zu funktionieren.