こんにちは私は、新しいオブジェクトと更新されたオブジェクトが重複しているかどうかをチェックする方法があります。 方法:自己オブジェクトの検証を防ぐ方法
def timeline
if start_at_changed? || end_at_changed? || person_id_changed?
if (person.vacations.where('start_at <= ?', start_at).count > 0 &&
person.vacations.where('end_at >= ?', end_at).count > 0) ||
(person.vacations.where('start_at <= ?', start_at).count > 0 &&
person.vacations.where('end_at <= ?', end_at).count > 0 &&
person.vacations.where('end_at >= ?', start_at).count > 0) ||
(person.vacations.where('start_at >= ?', start_at).count > 0 &&
person.vacations.where('start_at <= ?', end_at).count > 0 &&
person.vacations.where('end_at >= ?', end_at).count > 0)
errors.add(:base, 'You have a vacation during this period.')
end
end
end
私の問題は、いくつかの休暇を編集しようとしています。たとえば変更した場合start_at妥当性検査は、このオブジェクトと戻りエラーもチェックします。例:start_at 2016-06-27、end_at:2016-06-30 2016年6月26日にstart_atを変更してみます。検証では、期間「2016-06-27-2016-06-30」がチェックされるため、「あなたはこの期間中休暇を取っています。」という結果が返されます。どのように私は更新だけを試して、チェックオブジェクトを除外するには他の?
をあなたは[ ''存在?]使用する必要があります(http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-exists-3F) 、 'count'ではなく、8つではなく1つのクエリを実行する必要があります。 –