【问题标题】:Reservation Type System w/ Validation - Rails 3.0带验证的预订类型系统 - Rails 3.0
【发布时间】:2011-02-17 11:57:01
【问题描述】:

尝试“验证”对象日期唯一性的最佳方法是什么。

--

例如,我有一个房间,一次只能容纳 1 个人。

用户可以提前预订此房间。

目前房间预订时间为 3 月 1 日至 3 月 5 日。

我想阻止任何人在这些日期再次预订。

因此,如果有人试图在 2 月 25 日至 3 月 2 日期间预订房间,我需要告诉他们他们不能预订,因为房间已订满。

--

我正在使用 Rails 3.0

【问题讨论】:

    标签: ruby-on-rails date validates-uniqueness-of


    【解决方案1】:

    我刚刚编写了一个简单的应用程序来测试这一点。这是我最终在模型验证中使用的内容。

    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 之间,第二个自定义验证对 end_date 执行相同操作。您可能希望通过执行类似查询(使用 .all 而不是 .count,并添加所有匹配房间的详细信息)。

    这是我使用的数据库迁移

    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
    

    【讨论】:

    • 非常感谢您。我会试试这个。
    • 如果预订的 start_date 早于已存在预订的 start_date 并且尝试的结束日期在该现有预订的结束日期之后怎么办......那么我也应该有冲突。 ..因为本质上他们试图预订整个活动,而不仅仅是在它的开始和结束日期内......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2020-10-03
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多