2017-11-14 2 views
0

Ich versuche einen Reservierungs-/Buchungstermin zu erstellen, der Benutzer wählt zwei Daten aus: Startdatum und Enddatum, wie kann ich das Datum vom Anfangs- und Enddatum bestätigen und auch die Daten validieren zwischen diesen beiden Daten verhindert den Benutzer wieder das Starten, Enddatum und die Daten dazwischen zu wählen.Validierung zwischen zwei Datumsangaben

Datenbank

date_start | date_end 
14/11/2017  14/18/2017 

Ausblick:

Datumsfeld für die Tage

<%= f.label :'date_start:' %> 
<%= f.date_field :date_start %> 

<%= f.label :'date_end:' %> 
<%= f.date_field :date_end %> 

Modell

class Reservation < ApplicationRecord 
belongs_to: user 
validates :date_start, uniqueness: true 
validates :date_end, uniqueness: true 
end 

I verwendet validates :date_start, uniqueness: true und validates :date_end, uniqueness: true, aber es prüft nur den Datumsbeginn und das Datum_ende, aber es prüft nicht die Daten dazwischen.

Antwort

0

Sie werden über ein separates Verfahren haben, haben den komplexen Validierungscode zu halten. Verwenden Sie validate :method_name (ohne ein 's'), um es aufzurufen.

Die Methode sollte Fehler zum Objekt hinzufügen, wenn ein Problem auftritt.

Etwas wie folgt aus:

validate :no_reservation_overlap 

scope :overlapping, ->(period_start, period_end) do 
    where "((date_start <= ?) and (date_end >= ?))", period_end, period_start 
end 


private 

def no_reservation_overlap 
    if (Reservation.overlapping(date_start, date_end).any?) 
    errors.add(:date_end, 'it overlaps another reservation') 
    end 
end 
+0

Ich bin mir nicht sicher, was Sie fragen. Du musst mir eine bessere Vorstellung davon geben, was deine App gerade macht. Was ist eine Reservierung und wie interagiert ein Nutzer damit? –

+0

Wenn es eine separate Frage ist, sollten Sie sie wahrscheinlich als separate Frage stellen. Und wenn diese Antwort Ihre ursprüngliche Frage richtig beantwortet, können Sie auf "Akzeptieren" klicken. –

0
 validate :check_overlapping 

    scope :overlaps, ->(date_start, date_end) do 
     where "((date_start <= ?) and (date_end >= ?))", date_end, date_start 
    end 

    def check_overlapping 
     errors.add(:date_start, 'your error messages') if overlaps(date_start, date_end).any? 
    end 

Ende

+0

Ihr Umfang ist gebrochen. Es wird keine partiellen Überlappungen enthalten –

+0

ok, Sie haben es behoben. Gut gemacht –

+0

Ich reparierte es. Vielen Dank! –

Verwandte Themen