我的模型中有这样的方法:
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
发布于 2014-12-18 13:23:46
不幸的是,如果要在DateTime范围上迭代,则范围的粒度应该至少为1天。因此,似乎是在使用#date_ranges
**,的地方,而不是在方法本身**中,出现了错误。
由于您使用的是ActiveSupport::TimeWithZone
(这是使用datetime
SQL类型时得到的对象类型),所以您有一些比日期更精确的东西--您也有时间。
这取决于你如何使用这个方法。
您可以有两个选项来解决这个问题:
#date_ranges
方法的方式。最好是让它返回[begin_date, end_date]
数组。
def date_ranges Reservation.where(transport_id: transport_id).pluck(:reservation_start,:reservation_end)结束
根据使用范围的方式,您可以找出以下内容:- 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| #显示日期范围结束
https://stackoverflow.com/questions/27546680
复制相似问题