相关模型的Rails自定义验证

时间:2018-04-22 21:17:12

标签: ruby-on-rails ruby activerecord ruby-on-rails-5 activemodel

我有两个名为Task和Employee的模型,它们具有多对多的关系。

--------------------------332c61f93bcd60b4
Content-Disposition: form-data; name="image"; filename="Cat.jpg"
Content-Type: image/jpeg

...

--------------------------332c61f93bcd60b4--

我想要一个这样的功能。员工在同一时间段内不能拥有多项任务。任务模型有start_date和duration字段,所以我需要字段来进行验证。

class Task < ApplicationRecord
  has_and_belongs_to_many :employees
end

当我将新任务推送到员工的任务时,我想验证该员工是否已经与新员工发生冲突。我怎样才能做到这一点?

感谢。

1 个答案:

答案 0 :(得分:0)

这是一种方式,不是最好的,但应该有效。在任务模型中,添加自定义验证以检查定义期间是否存在相同用户的其他任务。

class Task

validate :check_overlapping_tasks


def check_overlapping_tasks
  end_date = start_date + duration
        Task.where(user_id: user_id)
            .where.not(id: id)
            .where("(start_date BETWEEN ? AND ? ) OR  (DATE_ADD(created_at, INTERVAL ? MINUTE)  BETWEEN ? AND ?)", start_date, end_date, duration, start_date, end_date)
   if overlapped_tasks.count > 0 
     errors.add(:base, 'User X has tasks in this period')
   end
 end

end