我正在创建一个需要确保计划的“行程”不会重叠的系统。为此,我试图验证 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-01-30 00:00:00 UTC 时进入了 rails ,我不完全理解。
如果我尝试在这个值上使用 Date.parse() 它会给出错误:
TypeError in TripsController#create
$_ value need to be String (nil given)
Rails.root:
/Users/phil/Sites/travlrapp.com
Application Trace | Framework Trace |
Full Traceapp/models/trip.rb:29:in
validate_each'
create'
app/controllers/trips_controller.rb:75:in
app/controllers/trips_controller.rb:74:in
`create'
每当我运行查询时,都不会返回任何内容。这可能是日期格式问题,是我的逻辑被破坏了还是我在做一些非常愚蠢的事情?被困在这个问题上一段时间,谷歌没有帮助。
编辑 人们关注的是 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
现在我认为日期格式正确,这似乎更像是一个逻辑问题。我到底如何验证重叠日期 >。
最佳答案
Squeel 电源 FTW !!!我相信你会喜欢的
$ gem安装squeel
模型.rb
Model.where{date_colum > 10.years.ago & date_column < DateTime.now}
关于ruby-on-rails - Rails - 是两个日期之间的日期吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4774974/