【问题标题】:Need to set up a customised date range validator in Ruby On Rails需要在 Ruby On Rails 中设置自定义的日期范围验证器
【发布时间】:2012-05-16 08:00:14
【问题描述】:
我有以下型号,对应于下表:
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。
我有了设置验证器的想法,甚至为开始日期设置了一个简单的验证器,但是我坚持实施这种检查。我该怎么做?
【问题讨论】:
标签:
ruby
ruby-on-rails-3
validation
【解决方案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。如果范围很大,那么性能可能会下降。试试看是否可以接受。