Rails - 两个日期之间的日期?

Phi*_*eon 13 ruby-on-rails ruby-on-rails-3

我正在创建一个系统,需要确保计划中的"旅行"不要超过一圈.为此,我尝试验证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
Run Code Online (Sandbox Code Playgroud)

日期来自type ="date"字段,该字段由jQuery UI Datepicker提供,并包含格式2011-01-01.这是2011-01-30 00:00:00 UTC的轨道,我不完全理解.

如果我尝试对此值使用Date.parse(),则会给出错误:

TripsController中的TypeError #create

$ _ value需要是String(nil给出)

Rails.root:
/Users/phil/Sites/travlrapp.com
应用程序跟踪| 框架跟踪|
完整追踪

app/models/trip.rb:29:在创建' app/controllers/trips_controller.rb:74:在 'create'中
validate_each'
app/controllers/trips_controller.rb:75:in


每当我运行查询时,都不会返回任何内容.这可能是一个日期格式问题,我的逻辑是破碎还是我做了一些非常愚蠢的事情?被困在这一段时间谷歌没有帮助.

编辑人们注重Date.parse错误,但不是主要问题.我陷入困境的是,当一切都是完全不同的格式时,我不明白如何进行日期比较.

我已经为Chronic.parse()交换了Date.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)
Run Code Online (Sandbox Code Playgroud)

这什么都不返回.我测试的日期是:

开始时间:2011-02-17 00:00:00.000000结束时间:2011-02-21 00:00:00.000000

看来我认为日期格式正确,现在看起来更像是一个逻辑问题.我怎么能验证重叠日期>.

小智 10

Squeel power FTW !!! 我相信你一定会喜欢它

$ gem install squeel

model.rb

Model.where{date_colum > 10.years.ago & date_column < DateTime.now}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解决方案,除了上面可能必须是:```Model.where {(date_colum> 10.years.ago)&(date_column <DateTime.now)}``` (7认同)