1

私の検証の 1 つで、ユーザーの日付範囲の入力が既存の保存された日付範囲と重複していないことを確認したいと思います。

class Timecard < ActiveRecord::Base
  validate :does_not_intersect_with_existing_timecards

  def does_not_intersect_with_existing_timecards
    if from_date && to_date &&
      !Timecard.where("? <= to_date AND ? >= from_date", from_date, to_date).empty?
      errors.add(:from_date, "must not intersect with existing timecards")
    end
  end
end

問題は、この検証がupdateメソッドから呼び出された場合に失敗することです (where節がデータベースで現在更新されているレコードを検出するため)。on: :createユーザーは日付範囲を編集する可能性があるため、検証だけはしたくありません。

現在のモデルを検証クエリから除外するにはどうすればよいですか?

検証メソッド内からidアクセスできないようです...@id

4

2 に答える 2

2

これで試してみてください

def does_not_intersect_with_existing_timecards
  if self.new_record?  
     errors.add(:from_date, "must not intersect with existing timecards") if from_date && to_date && !Timecard.where("? <= to_date AND ? >= from_date ", from_date, to_date).empty?
  else
     errors.add(:from_date, "must not intersect with existing timecards") if from_date && to_date && !Timecard.where("? <= to_date AND ? >= from_date AND id != ?", from_date, to_date, self.id).empty?
  end

end

また

def does_not_intersect_with_existing_timecards
   errors.add(:from_date, "must not intersect with existing timecards") if from_date && to_date && !Timecard.where("#{self.new_record? || 'id != ' + self.id.to_s} AND ? <= to_date AND ? >= from_date ", from_date, to_date).empty?
end
于 2013-09-27T11:07:23.047 に答える
1

before_save代わりにフックを使用できますvalidation

于 2013-09-27T11:03:50.373 に答える