Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 自定义验证器以防止Rails 4应用程序中的约会重叠?_Ruby On Rails_Validation - Fatal编程技术网

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

Ruby on rails 自定义验证器以防止Rails 4应用程序中的约会重叠?,ruby-on-rails,validation,Ruby On Rails,Validation,我需要帮助编写自定义验证,以防止Rails 4应用程序中的约会重叠。我编写这个应用程序是为了自学Ruby和Rails。在研究这个问题时,我发现了一个名为ValidateOverlap的gem,但我想编写自己的验证器以供学习 我的约会模型有日期时间数据类型的“约会时间”列和时间数据类型的“持续时间”列。预约模式与会员和培训师模式有“has_many:through”联系。任命: belongs_to :member belongs_to :trainer 约会模型中的现有验证包括: valida

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

我的约会模型有日期时间数据类型的“约会时间”列和时间数据类型的“持续时间”列。预约模式与会员和培训师模式有“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预订了与会员_1的1小时预约,从上午7:00开始,则我的模型验证会阻止会员_2预订与trainer_1的7:00预约。但是,我目前没有办法阻止成员_2与培训师_1安排上午7:01的课程!我使用两个属性:“约会时间”是约会的开始时间,“持续时间”是约会的总时间。如果我可以从“约会时间”和“持续时间”值轻松计算“结束时间”,我更愿意保留这些属性/列。我还不知道怎么做:)


如果您能给我一些想法或建议,告诉我如何解决重叠预约的问题(不使用gem),我将不胜感激。非常感谢

我刚才也有同样的问题。您需要一个作用域
:overlapping
,用于读取约会的重叠约会,并需要一个验证器进行检查。此示例适用于PostgreSQL数据库。如果您正在使用另一个DB,则必须针对您的DB进行调整

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
班级预约(a){
其中(%q{(预约时间,(预约时间+持续时间))重叠(?,)},a.预约时间,a.预约时间)
.where(%q{id!=?},a.id)
.where(培训师编号:a.trainer.id)
}
def查找重叠
self.class.overlapping(self)
结束
def重叠?
self.class.overlapping(self.count)大于0
结束
国防部长任命
(约会时间为+duration.hour.hours+duration.min.minutes+duration.sec.seconds)。至日期时间
结束
受保护的
国防部长办公室任命
如果重叠?

错误[:base]谢谢Hiasinho!我正在使用PostgresSQL进行开发、测试和部署数据库。我会尽早尝试一下;我现在告诉你它是如何运行的。运行代码会导致一个“未定义的方法”错误:任命中的NoMethodError控制器#为提取的源创建未定义的方法`和'(在第29行附近):第29行是以下代码:。和。其中(trainer\u id:a.trainer.id)似乎Rails 4反对“。和,”说这是一个未定义的方法。我删除了“.”和“所以,看看会发生什么,该模型阻止保存所有约会,从而提出了约会与另一个约会重叠的反对意见。关于如何诊断和解决这个问题,有什么想法吗?我现在正在做这件事。我对代码做了一些修改。添加了排除当前约会的位置(如果保留),并添加了
重叠?
方法。尝试使用byebug进行调试。你有这方面的规范吗,还是在控制台中进行测试?Hiasinho,当会员试图安排与培训师的重叠预约时,新代码会按预期工作。培训师的范围界定不是问题。谢谢你的帮助!我真的很感激!我发现了一个奇怪的验证案例。在创建时,验证不会阻止在现有约会开始时间之前开始的“重叠”约会。但是,如果我编辑并重新保存仍然重叠的AppPoint,验证将启动并阻止它保存到DB。是什么导致了这种奇怪的行为?它可能与控制器相关,因为它似乎会影响重叠约会的创建和编辑。我正在尝试解决这个问题,但感到困惑。这是一次很棒的学习经历!有什么想法吗?