2 Stimmen

Rails-Instanzvariable basierend auf der Zeit?

Kurze Frage. Wenn ich ein Modell habe, sagen wir Charities, das eine start_date y un end_date Attribut, wie kann ich das als das current_charity aus einer Methode im Controller?

Ich weiß, dass ich irgendetwas tun muss. Charities.find(params[:something]) und müssen das nur noch einstellen current_charity gleich einer, die start_date ist >= das aktuelle Datum, und wer ist end_date <= das aktuelle Datum ist (es gibt immer nur ein "aktuelles" Datum). Normalerweise habe ich ein Modell nur über params[:id] gefunden, daher ist dies neu für mich.

Ich danke Ihnen!

5voto

Thilo Punkte 16996

Fügen Sie eine Scope-Methode in Ihr Modell ein:

def self.current
  now = Time.now
  where("start_date <= ? AND ? <= end_date", now, now).first
end

Dann in Ihrem Controller:

current_charity = Charity.current

1voto

AlexChaffee Punkte 7752

Schnelle Antwort: Suche nach der Wohltätigkeitsorganisation, deren end_date ist gleich Null.

Längere Antwort: Ihr Datenmodell entspricht möglicherweise nicht der von Ihnen gewünschten Semantik. Es scheint mir, dass start_date ist hier irrelevant - ist nicht die aktuelle Wohltätigkeitsorganisation diejenige, deren Enddatum noch nicht erreicht wurde?

Im Allgemeinen besteht eine Möglichkeit, das aktuellste X zu erhalten, darin, alle X zu holen, sortiert nach absteigendem Datum, und das erste zu nehmen (oder in SQL-Begriffen, LIMIT 1 zu verwenden). In ActiveRecord sieht das in etwa so aus:

Charity.order("end_date DESC").first

obwohl ich ein bisschen rostig auf meine Rails 3 AR-Syntax bin, und ich glaube nicht, dass die Abfrage Ihr eigentliches Problem lösen wird (obwohl es irgendwie cool aussieht, amirite?).

Eine andere Lösung ist die Denormalisierung - das Hinzufügen eines current boolesches Feld, und ein before_save Filter, der die self[:current] auf der Grundlage der von Ihnen beschriebenen Logik. EDIT: Eigentlich wird das hier nicht funktionieren, da die Zeit voranschreitet und sich das, was aktuell ist, außerhalb des Rahmens der Daten eines einzelnen Modells ändert.

Mein bester Rat ist, eine Menge Unit-Tests zu schreiben! Zeitbasierte Logik ist sehr kompliziert und es ist leicht, einen Grenzfall zu übersehen.

0voto

Larry K Punkte 45322

Denken Sie daran, in Ihrer Datenbank Indizes für Spalten hinzuzufügen, die Sie häufig bei Suchvorgängen verwenden werden.

Hinzufügen von Indizes durch Hinzufügen einer db-Migration.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X