2016-05-01 3 views
0

Ich erstellte ein Modell: Vortrag (start_time, end_time, location). Ich möchte Validierungsfunktionen schreiben, um zu überprüfen, ob sich die Zeit der neuen Vorlesung mit gespeicherten Vorlesungen in der Datenbank überschneidet. So kann ich herausfinden, ob der Ort in dieser Zeit besetzt ist. Meine Funktion ist:Wie Überprüfungszeit Überlappungen in Schienen

class Lecture < ActiveRecord::Base 

validates :title, :position, presence: true 

validates :start_time, :end_time, format: { with: /([01][0-9]|2[0-3]):([0-5][0-9])/, 
     message: "Incorrect time format" } 

validate: time_overlap 

def time_overlap 
    Lecture.all.each do |user| 
     if (user.start_time - end_time) * (start_time - user.end_time) >= 0      
     errors.add(:Base, "time overlaps") 
     end 
    end 
end 

end 

Die Fehlermeldung: NoMethodError in LecturesController # erstellen nicht definierte Methode `- @‘ für nil: NilClass. Wie schreibe ich diese Funktion im richtigen Format?

+0

Sie erwähnten, Sie bekommen Fehler in Ihrem Controller und haben noch nicht den Controller-Code hinzugefügt ?? – Alfie

+0

Sie haben einen Tippfehler in der 'create' Methode Ihrer' lectures_controller.rb' (die Sie übrigens vernachlässigt haben). Abgesehen davon ist Ihre Herangehensweise an Zeitkonflikte ineffizient. Anstatt alle Vorlesungen aus der Datenbank zu laden und sie in Ruby zu vergleichen, erstellen Sie am besten eine Abfrage, die Vorlesungen mit start_time new_lecture.end_time auswählt. Machen Sie im Anwendungscode nicht, was Ihre Datenbank für Sie tun kann. – MarsAtomic

+0

Der Controller funktioniert gut ohne time_overlap Funktion, ich verstehe einfach nicht, was '' undefined Methode '- @ 'für nil: NilClass" in diesem Fall. Ich denke, mein Code in time_overlap hat falsche Ruby Stil. Ich hoffe, zu überprüfen, ob Zeit überschneidet sich mit korrektem Code – runchu

Antwort

1

Werfen Sie einen Blick auf Ruby 2.3.0 Klasse Time: http://ruby-doc.org/core-2.3.0/Time.html

Sie es, wenn eine Zeit Beispiel vor oder nach einer anderen Zeit Instanz ist, wie können Sie überprüfen:

t1 = Time.now 
t2 = Time.now 
t1 < t2 
=> true 
t1 > t2 
=> false 

So, Um zu überprüfen, ob eine gegebene Zeit während eines bestehenden Vortrags in der Datenbank vorhanden ist, könnten Sie Ruby schreiben, um zu überprüfen, ob die Startzeit oder Zielzeit des vorgeschlagenen Vortrags nach der Startzeit und vor der Endzeit vorhandener Vorlesungen liegt.

+0

Es ist erwähnenswert, dass, obwohl < tadman