2

オブジェクトの日付の一意性を「検証」しようとする最善の方法は何でしょうか。

--

たとえば、一度に 1 人しか入室できない部屋があります。

ユーザーはこの部屋を事前に予約できます。

現在、お部屋は3月1日から3月5日までご予約いただいております。

それらの日に誰も予約できないようにしたい.

そのため、誰かが 2 月 25 日から 3 月 2 日までに部屋を予約しようとした場合、部屋が満室であるため、予約できないことを伝える必要があります。

--

Rails3.0を使用しています

4

1 に答える 1

2

これをテストするための簡単なアプリを作成しました。これが、モデルの検証で最終的に使用したものです。

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
于 2011-02-17T15:06:29.320 に答える