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 日分别用于产品 ID 1。

我有了设置验证器的想法,甚至为开始日期设置了一个简单的验证器,但是我坚持实施这种检查。我该怎么做?

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

需要注意的一件事是 date.to_i。如果范围很大,那么性能可能会下降。试试看是否可以接受。

于 2012-05-16T14:59:45.203 回答