0

次の表に対応する次のモデルがあります。

PriceAvailability

ID| PRODUCT_ID| VALID_FROM|VALID_TO|PRICE

基本的に、テーブルには特定の日付範囲の特定の製品の価格が格納されます。製品のように、2012年1月1日から2012年5月3日までは10ドル、5月3日から6月末までは12ドルなどです。次のような検証ツールを設定する必要があります。

  • 各レコードに、その特定の製品の別の日付範囲と重複または競合しない日付範囲があることを確認します。つまり、2012年1月1日から2012年3月1日までと2012年2月1日から2012年4月1日までの日付範囲を持つ2つの行を含めることはできません。それぞれ製品ID1の場合。

バリデーターを設定し、開始日の単純なバリデーターを設定することも考えましたが、この種のチェックを実装することに固執しています。どうすればいいですか?

4

1 に答える 1

1

これがうまくいくかどうか教えてください:

validate :ensure_unique_date_ranges

def ensure_unique_date_ranges
  date_ranges = (products.price_availabilities - [self]).map{ |pa| (pa.valid_from.to_i..pa.valid_to.to_i) }
  self.errors[:base] << 'date range is invalid' if date_ranges.detect{ |dr| (dr.to_a & (valid_from.to_i..valid_to.to_i).to_a).empty? }
end

注意すべきことの 1 つは、date.to_i です。範囲が大きい場合、パフォーマンスが低下する可能性があります。受け入れられるかどうか試してみてください。

于 2012-05-16T14:59:45.203 に答える