我的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
问题是您正在丢失数据库正确处理时区转换所需的信息。您转换为 DATE() 并且您的记录在前一天位于数据库中,因此这是行不通的。
您想要的是一个范围查询,其日期时间涵盖相关日期,并将转换为正确的范围。
这个基本的轨道范围查询可以工作。
where(order_datetime: Date.current.midnight..(Date.current.midnight + 1.day))
这样,当针对数据库运行查询时,范围的两端将转换为 UTC。
您应该能够重写您的掠夺者以使用该范围查询而不是 DATE 转换,它将保留您的时区转换。