Mar*_*arc 11 validation ruby-on-rails
我有一个涉及员工缺勤记录的申请.
我需要确保每条记录的开始和结束日期不重叠.
因此,例如,如果我输入了今天开始并明天结束的缺勤记录,则不应该以任何方式在该日期范围内输入另一个记录.所以我不能制作一个在今天前一天开始,然后在后天或任何更晚的日期结束.
简而言之,我需要使日期范围独一无二.
实现这一目标的最佳方法是什么?
模型类中涉及遍历所有记录的自定义验证器需要很长时间才能完成,而且我没有找到任何解决此问题的宝石.我也没有找到任何简单的方法来确定模型中的唯一性.我很难过:/
谢谢你的时间!
编辑:
class Absence < ActiveRecord::Base
attr_accessible :date, :date_ended, :status, :reason, :form, :user_id, :tempuser, :company_id
belongs_to :user
default_scope { where(company_id: Company.current_id) }
validates :date, :date_ended, :status, :reason, :form, :user_id, presence: true
validates_numericality_of :user_id, :only_integer => true, :message => "can only be whole number."
end
Run Code Online (Sandbox Code Playgroud)
jua*_*tas 18
我用这些:
scope :overlaps, ->(start_date, end_date) do
where "(DATEDIFF(start_date, ?) * DATEDIFF(?, end_date)) >= 0", end_date, start_date
end
def overlaps?
overlaps.exists?
end
# Others are models to be compared with your current model
# you can get these with a where for example
def overlaps
siblings.overlaps start_date, end_date
end
validate :not_overlap
def not_overlap
errors.add(:key, 'message') if overlaps?
end
# -1 is when you have a nil id, so you will get all persisted user absences
# I think -1 could be omitted, but did not work for me, as far as I remember
def siblings
user.absences.where('id != ?', id || -1)
end
Run Code Online (Sandbox Code Playgroud)
资料来源:https://makandracards.com/makandra/984-test-if-two-date-ranges-overlap-in-ruby-or-rails
小智 8
作为对已接受答案的修改,这里是一个重叠范围,适用于不理解DATEDIFF的DB
scope :overlaps, ->(start_date, end_date) do
where "((start_date <= ?) and (end_date >= ?))", end_date, start_date
end
Run Code Online (Sandbox Code Playgroud)
这借鉴了确定两个日期范围是否重叠的解决方案
使用宝石validates_overlap
.
gem 'validates_overlap'
Run Code Online (Sandbox Code Playgroud)
例如,如果您Meeting
使用a start_date
和end_date
类型字段调用模型,则date
可以轻松验证它们是否重叠.
class Meeting < ActiveRecord::Base
validates :start_date, :end_date, overlap: true
end
Run Code Online (Sandbox Code Playgroud)
另一个更现实的例子,比如Meeting
belongs_to a User
,你可以将其范围化,因此它只验证特定用户的会议.
class Meeting < ActiveRecord::Base
belongs_to User
validates :start_date, :end_date, overlap: { scope: 'user_id',
message_content: 'overlaps with Users other meetings.' }
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5221 次 |
最近记录: |