首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >铁路TimeWithZone与日期

铁路TimeWithZone与日期
EN

Stack Overflow用户
提问于 2014-12-18 12:31:06
回答 1查看 997关注 0票数 2

我的模型中有这样的方法:

代码语言:javascript
运行
复制
def date_ranges
  reservations = Reservation.where(["transport_id =?", transport_id])
  reservations = reservations.where(['id <> ?', id]) if !id.nil?
  reservations.map { |e| e.reservation_start..e.reservation_end }
end

它运行得很好(多亏了StackOverflow的一些帮助)。

我的reservation_startreservation_end列是date类型的。这是我的迁徙:

代码语言:javascript
运行
复制
class CreateReservations < ActiveRecord::Migration
  def change
    create_table :reservations do |t|
      t.references :user, index: true
      t.references :transport, index: true

      t.date :reservation_start
      t.date :reservation_end
      t.timestamps
    end
  end
end

如果在从date列类型迁移到datetime类型之后尝试运行此方法,则会得到一个错误:

代码语言:javascript
运行
复制
can't iterate from ActiveSupport::TimeWithZone

即使我将方法中的代码更改为:

代码语言:javascript
运行
复制
reservations.map do |e|
  e.reservation_start.to_datetime..e.reservation_end.to_datetime
end
EN

回答 1

Stack Overflow用户

发布于 2014-12-18 13:23:46

不幸的是,如果要在DateTime范围上迭代,则范围的粒度应该至少为1天。因此,似乎是在使用#date_ranges**,的地方,而不是在方法本身**中,出现了错误。

由于您使用的是ActiveSupport::TimeWithZone (这是使用datetime SQL类型时得到的对象类型),所以您有一些比日期更精确的东西--您也有时间。

这取决于你如何使用这个方法。

您可以有两个选项来解决这个问题:

  1. 将代码更改为: e.reservation_start.to_date..e.reservation_end.to_date端reservations.map do /e/e 这样你就会失去时间的精确性,只会回到原来的日期。
  2. 改变使用#date_ranges方法的方式。最好是让它返回[begin_date, end_date]数组。 def date_ranges Reservation.where(transport_id: transport_id).pluck(:reservation_start,:reservation_end)结束 根据使用范围的方式,您可以找出以下内容:

代码语言:javascript
运行
复制
- If you're checking if a particular time is within any of given date ranges, you can do this:

date_ranges.any?{ |date_range| date_range.cover?(my_time) }

-如果你要显示日期:

date_ranges.each do |date_range| #显示日期范围结束

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27546680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档