【发布时间】:2011-01-23 16:42:35
【问题描述】:
我正在创建一个系统,该系统需要确保计划中的“旅行”不会重叠。为此,我正在尝试验证 start_date 和 end_date 以确保它们不在另一次旅行的开始和结束日期内。
class TripdateValidator < ActiveModel::EachValidator
def validate_each(object, attribute, value)
# Check value exists as end_date is optional
if value != nil
parsed_date = Date.parse(value)
# is the start date within the range of anything in the db
trips = Trip.where(['start_date >= ? AND end_date <= ? AND user_id = ?', parsed_date, parsed_date, object.user_id])
# overlapping other trips, aghhh
object.errors[attribute] << 'oh crap' if trips
end
end
end
日期来自 type="date" 字段,该字段由 jQuery UI Datepicker 提供支持,格式为 2011-01-01。这在 2011 年 1 月 30 日 00:00:00 UTC 时出现了问题,我不完全理解。
如果我尝试在这个值上使用 Date.parse() 它会给出错误:
TripsController#create 中的类型错误
$_ 值必须是字符串(给定 nil)
Rails.root:
/Users/phil/Sites/travlrapp.com
应用程序跟踪 |框架跟踪 |
全跟踪app/models/trip.rb:29:in
validate_each'create'
app/controllers/trips_controller.rb:75:in
应用程序/控制器/trips_controller.rb:74:in
`创建'
每当我运行查询时,都不会返回任何内容。这可能是日期格式问题,是我的逻辑错误还是我在做一些非常愚蠢的事情?被困了一段时间,谷歌没有帮助。
编辑 人们关注的是 Date.parse 错误,但这不是主要问题。我卡住的地方是,当一切都采用完全不同的格式时,我不明白如何进行日期比较。
我已将 Date.parse() 替换为 Chronic.parse(),现在我生成了以下 SQL 查询:
SELECT "trips".* FROM "trips" WHERE (start_date >= '2011-01-26 00:00:00.000000' AND end_date <= '2011-01-26 00:00:00.000000' AND user_id = 19)
这不返回任何内容。我正在测试的日期是:
开始:2011-02-17 00:00:00.000000 结束:2011-02-21 00:00:00.000000
我认为现在日期格式正确,这似乎更像是一个逻辑问题。我怎么能验证重叠的日期>。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3