具有验证的预留类型系统 - Rails 3.0

时间:2011-02-17 11:57:01

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

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

-

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

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

目前,会议室的预订时间为3月1日至3月5日。

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

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

-

我正在使用Rails 3.0

1 个答案:

答案 0 :(得分:2)

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

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