2017-11-14 20 views
0

私は予約/予約予約を作成しようとしています。ユーザは開始日と終了日の2つの日付を選択します。開始日と終了日から日付を検証し、それらの2つの日付の間に、は、ユーザーが開始日、終了日、およびその間の日付を再び選択することを防止する。2つの日付レール間のバリデーション

データベース

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

ビュー:私はを使用

日フィールドの日付の

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

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

モデル

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

0とvalidates :date_end, uniqueness: trueですが、startとdate_endの日付のみをチェックしますが、その間の日付はチェックしません。

答えて

0

あなたは複雑な検証コードを保持するための別の方法を持っている必要があるとしています。それを呼び出すにはvalidate :method_name( 'なし')を使用してください。

このメソッドは、問題が見つかった場合にオブジェクトにエラーを追加する必要があります。このような

何か:

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

あなたが何を求めているのか分かりません。あなたは、あなたのアプリがやっていることをより良く理解してくれなければなりません。予約とは何ですか?また、ユーザーは予約とどのように対話しますか? –

+0

別の質問の場合は、おそらくそれを別の質問として尋ねるべきです。この回答が元の質問に正しく答えた場合は、[同意します]をクリックしてください。 –

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 

エンド

+0

あなたのスコープが壊れています。部分的なオーバーラップは含まれません –

+0

ok、あなたはそれを修正しました。よくできた –

+0

私はそれを修正しました。ありがとう! –

関連する問題