概要
Ruby on Railsで予約システムを構築する際、特定のビジネスロジックを実装する必要がある場合があります。例えば、一人の顧客が一つの企業に対して、ある任意の1日につき作成できる予約は1つだけにする、といったケースです。さらに、この制限を未来の日付にのみ適用し、過去の日付には適用しないようにする必要があります。この記事では、そのような機能を実装する方法について説明します。
バリデーションの設定
Reservation
モデルに、顧客ID、企業ID、および日付の組み合わせが一意であることを保証するバリデーションを追加します。このバリデーションは、日付が今日以降である場合にのみ適用されます。
class Reservation < ApplicationRecord
validates :customer_id, uniqueness: {
scope: [:company_id, :date],
message: "can only make one reservation per company per day",
if: :date_in_the_future?
}
private
# dateがnilでなく、かつ今日以降の日付であることの確認
def date_in_the_future?
date && date >= Date.today
end
end
バリデーションの解説
-
validates
メソッドは、指定されたフィールドの値がユニークであることを保証します。この場合、customer_id
フィールドがユニークである必要がありますが、scope
オプションを使用して、このユニーク性がcompany_id
とdate
フィールドの組み合わせに対してのみ適用されるように指定しています。 -
message
オプションでは、バリデーション違反が発生した場合に表示するカスタムエラーメッセージを設定します。 -
if: :date_in_the_future?
オプションにより、date_in_the_future?
メソッドがtrue
を返す場合にのみ、このバリデーションが適用されます。これにより、過去の日付に対してはこの一意性のバリデーションが適用されません。
まとめ
上記の実装により、システムは未来の日付に対する予約を適切に管理できるようになります。1人の顧客が同じ企業に対して同日に複数の予約を行うことができないため、予約の重複を防ぐことができます。