Rails 6 活动记录时区搜索问题

问题描述 投票:0回答:1

我的rails 6.0.3应用程序在postgres数据库上运行,它有一个order_datetime列(没有时区的时间戳)并在application.rb中将time_zone配置为加尔各答。比 UTC 早 +5.30 小时

config.time_zone = '加尔各答'

当用户为order_datetime的参数提交当前日期时间(2024-08-12 01:42:02 AM)时,该值将作为前一个日期存储在数据库列中,如2024-08-11 20:12:02。但通过 app(l object.order_datetime) 检索时会显示实际值 2024-08-12 01:42 AM。 目前为止没问题。

问题始于按日期搜索。当用户按当前日期2024-08-12搜索时,该日期不会生成任何结果,因为数据库中的值存储在较早的日期中。我正在使用 ransack gem 进行简单搜索。

sales_controller.rb

def index
  @search = Sale.ransack(params[:q])
end

sale.rb 模型

order_datetime_eq do
  Arel.sql("date(order_datetime)")
end

index.html.haml

= search_form_for @search, url: sales_path, method: :get do |search|
= search.search_field :order_datetime_eq, value: (l Date.current), :class => "form-control"

# Here Date.current returns current date as 2024-08-12 01:42 AM
ruby-on-rails postgresql activerecord timezone
1个回答
0
投票

问题是您正在丢失数据库正确处理时区转换所需的信息。您转换为 DATE() 并且您的记录在前一天位于数据库中,因此这是行不通的。

您想要的是一个范围查询,其日期时间涵盖相关日期,并将转换为正确的范围。

这个基本的轨道范围查询可以工作。

where(order_datetime: Date.current.midnight..(Date.current.midnight + 1.day))

这样,当针对数据库运行查询时,范围的两端将转换为 UTC。

您应该能够重写您的掠夺者以使用该范围查询而不是 DATE 转换,它将保留您的时区转换。

© www.soinside.com 2019 - 2024. All rights reserved.