gpt4 book ai didi

ruby-on-rails - 自定义验证器以防止 Rails 4 应用程序中的重叠约会?

转载 作者:行者123 更新时间:2023-12-03 22:40:58 27 4
gpt4 key购买 nike

我需要帮助编写自定义验证以防止 Rails 4 应用程序中的重叠约会。我编写这个应用程序是为了自学 Ruby 和 Rails。在研究这个问题时,我发现了一个名为 ValidatesOverlap 的 gem,但我想编写自己的验证器以用于学习目的。

我的约会模型有一个日期时间数据类型的“appointment_at”列和一个时间数据类型的“duration”列。 Appointment 模型与 Member 和 Trainer 模型具有“has_many :through”关联。预约:

belongs_to :member
belongs_to :trainer

约会模型中的现有验证包括:

validates :member, uniqueness: {scope: :appointment_at, message: "is booked already"}
validates :trainer, uniqueness: {scope: :appointment_at, message: "is booked already"}

自定义验证器需要防止成员或培训师安排重叠的约会。现在,我可以阻止“重复约会”保存到数据库中,但无法阻止“重叠”约会。例如,如果 trainer_1 与member_1 预订了上午 7:00 开始的 1 小时预约,则我的模型验证会阻止member_2 与 trainer_1 预订上午 7:00 的预约。然而,我目前没有办法阻止member_2 安排与trainer_1 一起在上午7:01 进行训练!我正在使用两个属性:“appointment_at”(开始时间)和“duration”(约会的总时间)。如果我可以轻松地从“appointment_at”和“duration”值计算“结束时间”,我宁愿保留这些属性/列。我还没想好怎么做:)

如果有任何关于如何解决重叠约会问题(不使用 gem)的想法或建议,我将不胜感激。非常感谢!

最佳答案

不久前我也遇到了同样的问题。您需要一个范围:overlapping,它读取约会的重叠约会和要检查的验证器。此示例适用于 PostgreSQL 数据库。如果您使用其他数据库,则必须针对您的数据库进行调整。

class Appointment < ActiveRecord::Base

belongs_to :member
belongs_to :trainer

validate :overlapping_appointments

scope :overlapping, ->(a) {
where(%q{ (appointment_at, (appointment_at + duration)) OVERLAPS (?, ?) }, a.appointment_at, a.appointment_to)
.where(%q{ id != ? }, a.id)
.where(trainer_id: a.trainer.id)
}

def find_overlapping
self.class.overlapping(self)
end

def overlapping?
self.class.overlapping(self).count > 0
end

def appointment_to
(appointment_at + duration.hour.hours + duration.min.minutes + duration.sec.seconds).to_datetime
end

protected

def overlapping_appointments
if overlapping?
errors[:base] << "This appointment overlaps with another one."
end
end

end

尝试一下,如果对您有帮助,请告诉我。

关于ruby-on-rails - 自定义验证器以防止 Rails 4 应用程序中的重叠约会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27834133/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com