具有validation的预留类型系统 – Rails 3.0

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

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

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

目前,客房从3月1日至3月5日预订。

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

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

我正在使用Rails 3.0

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

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 

第一个自定义validation检查当前记录的start_date是否落在任何记录的start_date和end_date之间,第二个对end_date执行相同操作。 您可能希望显示更好的错误消息(例如,通过执行类似查询(使用.all而不是.count,并添加全部),与当前记录冲突的记录的开始/结束日期是什么匹配房间的细节)。

这是我使用的db迁移

 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