- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的模型中有这个方法:
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_start
和 reservation_end
列是 date
类型。这是我的迁移:
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
类型后尝试运行此方法,我会收到错误消息:
can't iterate from ActiveSupport::TimeWithZone
即使我将方法中的代码更改为:它也不会工作:
reservations.map do |e|
e.reservation_start.to_datetime..e.reservation_end.to_datetime
end
最佳答案
不幸的是,如果您想迭代 DateTime 范围,则该范围的粒度至少应为 1 天。因此,看起来错误出在您使用#date_ranges
的地方,而不是方法本身。
由于您使用的是 ActiveSupport::TimeWithZone
(这是您在使用 datetime
SQL 类型时获得的对象类型),您得到的不仅仅是约会——你也有时间。
所以取决于你如何使用该方法。
您有两种选择来解决此问题:
将代码更改为以下内容:
reservations.map do |e|
e.reservation_start.to_date..e.reservation_end.to_date
end
这样你会失去时间精度,只能回溯到日期。
改变您使用#date_ranges
方法的方式。最好的办法可能是让它返回 [begin_date, end_date]
数组。
def date_ranges
Reservation.where(transport_id: transport_id).pluck(:reservation_start, :reservation_end)
end
根据您使用范围的方式,您可以弄清楚:
如果您要检查特定时间是否在任何给定日期范围内,您可以这样做:
date_ranges.any? { |date_range| date_range.cover?(my_time) }
如果您要显示日期:
date_ranges.each do |date_range|
# display the date range
end
关于ruby-on-rails - 铁路 TimeWithZone 与日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27546680/
我有一个这样的日期对象: >> the_date => Tue, 12 Jun 2012 >> the_date.class => Date 和一个存储为字符串的时区: >> tz = "Pacifi
我需要更新一个字段(称为 updated_at )。 MySQL 中的字段类型为 datetime ,而类(class)是 ActiveSupport::TimeWithZone .但是日期是像 "1
今天是 2 月 29 日:我们的测试失败的那一天。 我们的测试失败了,因为这些测试所做的事情最终可以与这样的命令进行比较:Time.zone.now - 1.year + 1.year .它恰好不等于
我正在Rails中生产API,其中一些响应包括日期。 在我的数据库中,这些字段设置为datetime字段,然后这些栏变成ActiveSupport::TimeWithZone对象。当我以日期时间回应请
我正在开发一个具有 config.time_zone = 'Kolkata'(UTC +5:30)的应用程序,我正在尝试为特定对象节省时间来自 ActiveAdmin 面板的 EST/EDT (UTC
我的模型中有这个方法: def date_ranges reservations = Reservation.where(["transport_id =?", transport_id])
我想要来自 ActiveSupport::TimeWithZone 实例的日期部分。我为此使用了 to_date 函数,但它会提前一天返回日期。 例如,如果日期时间是 2012-04-11 09:05
谁能解释一下 d1 为什么大于 d2?他们是同一个该死的约会对象(或者至少在我看来他们是这样的)。 Loading development environment (Rails 3.0.8) ruby
在我的测试套件中,我有一个失败的测试。 expected[0]['date']来自 SomeModel.first.created_at 在调试控制台中,我有以下内容: > expected[0]['
如何使 ActiveSupport::TimeWithZone 更快地构建或延迟? 我一直在分析我的 Rails 应用程序,我发现三分之一的 CPU 时间花在构建这些 TimeWithZone 对象上
我有一个 ActiveSupport::TimeWithZone 实例,如 2014-12-22 05:54:34 UTC,但我只想保留日期信息 2014-12-22 我试过 Rail 的 to_fo
我需要将 Date 对象转换为 TimeWithZone 对象,表示给定时区中那一天的开始。 以下方法可行,但似乎太复杂了,因为它需要我将日期转换为字符串: ?> date = Date.parse(
我有一种感觉,有人会向我指出另一个可以回答这个问题的问题,但我一直在搜索这个简单的问题,但没有运气。 我有一个带有日期时间属性的 Activerecord。它以 ActiveSupport:TimeW
在 Controller 方法中,当向用户发送激活电子邮件时,我将用户变量 activation_sent_at 设置为等于 Time.zone.now。在开发服务器上,这似乎可行(尽管我的应用程序中
我的 Waiver 模型上有一个 age 方法,如下所示: def age(date = nil) if date.nil? date = Date.today end
我试图在两个日期之间每隔 N 天步进一次。我尝试了以下代码,但没有用,因为 startDate 和 endDate 是 ActiveSupport::TimeWithZone 对象,而不是我想的 Da
我有一个简单的任务,我想获取一个开始日期和一个结束日期,然后循环计算天数/日期。这段代码正在我的 db:seed rake 任务中使用。目前,我的代码经历了以下尝试。 (someModel.start
假设我有一个 Post 模型。 数据库中的一条记录是: 23|title_here|content_here|2011-02-20 08:01:55.583222|2011-02-20 08:01:5
我的代码中出现了一个非常奇怪的错误,我希望有人能帮助我解决这个问题。我有一个模型,它有一个 created_at 列和一个我创建的持续时间列。持续时间只是一个整数,假定为小时数。然后我试图将当前时间与
我在当前项目中比较 DateTime 时遇到了一段糟糕的时光(没有双关语意),特别是比较 ActiveSupport::TimeWithZone 的两个实例。问题是我的两个 TimeWithZone
我是一名优秀的程序员,十分优秀!