需要在Ruby On Rails中设置自定义日期范围验证程序

时间:2012-05-16 08:00:15

标签: ruby ruby-on-rails-3 validation

我有以下模型,对应下表:

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。

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

1 个答案:

答案 0 :(得分: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。如果范围很大,那么性能可能会下降。试试看它是否可以接受。