У меня есть модель, которая имеет две колонки (started_at
и ended_at
). Я хочу добавить настраиваемый валидатор, который гарантирует отсутствие другой записи с датами, которые совпадают с проверкой, которую я проверяю. До сих пор у меня есть:Проверка сроков наложения в Ruby on Rails
# app/models/event.rb
class Event < ActiveRecord::Base
validates_with EventValidator
end
# app/validators/event_validator.rb
class EventValidator < ActiveModel::Validator
attr_reader :record
def validate(record)
@record = record
validate_dates
end
private
def validate_dates
started_at = record.started_at
ended_at = record.ended_at
arel_table = record.class.arel_table
# This is where I'm not quite sure what type of query I need to perform...
constraints = arel_table[:started_at].gteq(ended_at)
.and(arel_table[:ended_at].lteq(started_at))
if record.persisted?
constraints = constraints
.and(arel_table[:id].not_eq(record.id))
end
if record.class.where(constraints).exists?
record.error[:base] << "Overlaps with another event"
end
end
end
Я не знаю точно, какой запрос мне нужен, чтобы гарантировать, что нет перекрытия. Любая помощь очень ценится