1
0

Ruby on Rails: 未来の予約に一意性のバリデーションを適用する

Posted at

概要

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_iddateフィールドの組み合わせに対してのみ適用されるように指定しています。
  • messageオプションでは、バリデーション違反が発生した場合に表示するカスタムエラーメッセージを設定します。
  • if: :date_in_the_future?オプションにより、date_in_the_future?メソッドがtrueを返す場合にのみ、このバリデーションが適用されます。これにより、過去の日付に対してはこの一意性のバリデーションが適用されません。

まとめ

上記の実装により、システムは未来の日付に対する予約を適切に管理できるようになります。1人の顧客が同じ企業に対して同日に複数の予約を行うことができないため、予約の重複を防ぐことができます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0