DB rails

时间:2018-01-23 17:13:15

标签: ruby-on-rails activerecord ruby-on-rails-5

我的数据库中的订单created_at非常重要。

当客户创建新订单并因此保存到数据库时,created_at提前一小时,例如如果在3:00创建订单,则DB中的created_at将为2:00。

我实际配置了application.rb以解决问题:

# timezone
config.time_zone = 'Paris'
config.active_record.default_timezone = :local

但是当我在控制器中进行时间比较时,它确实有效。

Order.where("created_at >= :start_time and meal_id = :meal", start_time: DateTime.new(Date.today.year, Date.today.month, Date.today.day - 1, 17, 0, 0), meal: @meal.ids[0])

以上代码应显示自昨天下午5:00以来创建的所有订单,但实际上缺少从下午5:00到下午6:00创建的订单。

再次,当我在Active Admin中查看我的桌子时,每餐的created_at是正确的,但是在控制台中查看它时提前一小时。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

请尝试1.day.ago,其中考虑了您的代码所没有的时区。

Order.where("created_at >= :start_time and meal_id = :meal", start_time: 1.day.ago, meal: @meal.ids[0])

如果您想要特定时间的开头,正如您的代码所暗示的那样,请尝试1.day.ago.beginning_of_hour

Order.where("created_at >= :start_time and meal_id = :meal", start_time: 1.day.ago.beginning_of_hour, meal: @meal.ids[0])

旁注:使用Rails,如果你发现自己正在进行某种复杂的日期操作,你应该看看Rails是否已经支持它了。还有更多函数here

答案 1 :(得分:1)

数据库中的时间是UTC时间,它已正确存储。因此,您可以与utc时间进行比较以获得预期结果:

16:00

因此,如果数据库在utc中存储Count - (int)pow(2, maxD) + 1; ,则表示您所在时区的下午5点。

答案 2 :(得分:0)

好的,在尝试了几件事后,实际上有两个问题:

确实,第一个是关于时间的。第二个是@meal变量(我使用.where来获得正确的餐点,但使用.find_by使其正常工作)

我在我的DateTime对象的末尾添加了一个"+01:00",它完成了诀窍:

Order.where("created_at >= :start_time and meal_id = :meal", start_time: DateTime.new(Date.today.year, Date.today.month, Date.today.day - 1, 17, 0, 0, "+01:00"), meal: @meal.id)