尝试“验证”对象日期唯一性的最佳方法是什么。
--
例如,我有一个房间,一次只能容纳 1 个人。
用户可以提前预订此房间。
目前,房间的预订时间为 3 月 1 日至 3 月 5 日。
我想阻止任何人在这些日期再次预订。
因此,如果有人试图在 2 月 25 日至 3 月 2 日期间预订房间,我需要告诉他们他们不能,因为房间已订满。
--
我正在使用 Rails 3.0
尝试“验证”对象日期唯一性的最佳方法是什么。
--
例如,我有一个房间,一次只能容纳 1 个人。
用户可以提前预订此房间。
目前,房间的预订时间为 3 月 1 日至 3 月 5 日。
我想阻止任何人在这些日期再次预订。
因此,如果有人试图在 2 月 25 日至 3 月 2 日期间预订房间,我需要告诉他们他们不能,因为房间已订满。
--
我正在使用 Rails 3.0
我刚刚编写了一个简单的应用程序来测试这一点。这是我最终在模型验证中使用的内容。
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