2012-03-23 4 views
1

私はRails 3.1で予約システムを開発しています。 - 同じproduct_idを持つ別の予約の任意の期間をオーバーラップさRails 3.1での期間の扱い

# == Schema Information 
# 
# Table name: bookings 
# 
# id   :integer   not null, primary key 
# product_id :integer 
# customer_id :integer 
# booked_from :datetime 
# booked_to :datetime 
# paid   :boolean 
# payment_type :string(255) 
# created_at :datetime 
# updated_at :datetime 
# 

だから私がやりたいことは、各エントリを検証し、所望の時間(booked_to booked_fromが)かどうかをチェックすることです:私は予約のためのモデルを作成しました。製品にはavailable_fromおよびavailable_toフィールドもあり、これも検証する必要があります。

どうすればよいですか?

+1

関連:http://stackoverflow.com/questions/5028612/reservation-type-system-w-validation-rails-3-0/5030662#5030662 – Dogbert

+0

ありがとうございました。 – samuel02

答えて

3

チェックこれが動作するかどうか:

class Booking 
    validate :booking_period_not_overlapped 
    private 
    def booking_period_not_overlapped 
     unless Booking.where(
     '(booked_from <= ? AND booked_to >= ?) OR (booked_from >= ? AND booked_from <= ?)', 
     booked_from, booked_from, 
     booked_from, booked_to 
    ).empty? 
     errors.add(:booked_from, 'Invalid period.') 
     end 
    end 
end 

を持つbooked_fromとbooked_to次のいずれかの条件を満たし、既存のレコードが(新しい予約16:00から17時までであると仮定)がある場合それはちょうどチェック:

  1. それは(例えば15時00分午前17時30 - - 夜04時30分または15時00分)、新規予約の前に開始され、まだ終了して、新しい予約期間(例えば16以内に開始
  2. : 20〜16:50または16:30〜17:30)
+0

Booking.where以外でerrors.add(....)を追加した後で動作するようにしてください。正解であることを確認できるようにそれを追加してください。また、sqliteはスラッシュについて苦情を言いますので、行を上に移動して削除してください。ありがとう! – samuel02

+0

@ samuel02訂正ありがとう!私はコードを編集しました。 –

+0

また、Booking.whereを追加する必要があります(それ以外の場合は動作しません)。 – samuel02