オブジェクトの日付の一意性を「検証」しようとする最善の方法は何でしょうか。
--
たとえば、一度に 1 人しか入室できない部屋があります。
ユーザーはこの部屋を事前に予約できます。
現在、お部屋は3月1日から3月5日までご予約いただいております。
それらの日に誰も予約できないようにしたい.
そのため、誰かが 2 月 25 日から 3 月 2 日までに部屋を予約しようとした場合、部屋が満室であるため、予約できないことを伝える必要があります。
--
Rails3.0を使用しています
オブジェクトの日付の一意性を「検証」しようとする最善の方法は何でしょうか。
--
たとえば、一度に 1 人しか入室できない部屋があります。
ユーザーはこの部屋を事前に予約できます。
現在、お部屋は3月1日から3月5日までご予約いただいております。
それらの日に誰も予約できないようにしたい.
そのため、誰かが 2 月 25 日から 3 月 2 日までに部屋を予約しようとした場合、部屋が満室であるため、予約できないことを伝える必要があります。
--
Rails3.0を使用しています
これをテストするための簡単なアプリを作成しました。これが、モデルの検証で最終的に使用したものです。
class Booking < ActiveRecord::Base
validate :uniqueness_of_date_range
private
def uniqueness_of_date_range
errors.add(:start_date, "is not available") unless Room.where("? >= start_date AND ? <= end_date",
start_date, start_date).count == 0
errors.add(:end_date, "is not available") unless Room.where("? >= start_date AND ? <= end_date",
end_date, end_date).count == 0
end
end
最初のカスタム検証では、現在のレコードの start_date が任意のレコードの start_date と end_date の間にあるかどうかを確認し、2 番目のカスタム検証では end_date について同じことを行います。より適切なエラー メッセージを表示したい場合があります (現在のレコードと競合しているレコードの開始日/終了日など)。マッチングルームの詳細)。
これが私が使用したデータベース移行です
class CreateBookings < ActiveRecord::Migration
def self.up
create_table :bookings do |t|
t.date :start_date
t.date :end_date
t.string :title
t.timestamps
end
end
def self.down
drop_table :bookings
end
end