Rails中使用pluck查询时如何格式化返回的日期字段
解决方案
pluck 方法的作用是直接从数据库提取原始字段值,无法在 pluck 阶段直接完成 Ruby 层面的日期格式化,你可以选择以下两种方案实现需求:
方案1:查询阶段通过SQL函数格式化(性能更优,适合数据量较大的场景)
直接在查询时调用数据库的日期格式化函数处理,不需要额外遍历:
- 如果你使用 MySQL 数据库:
<%= f.select :resume, options_for_select( @user.resumes.includes(:blob).references(:blob) .pluck(:filename, "DATE_FORMAT(active_storage_blobs.created_at, '%m/%d/%Y')") .reverse .map{ |filename, date_str| "#{filename} #{date_str}" } ), prompt: '-- 请选择 --', class: 'form-control' %>
- 如果你使用 PostgreSQL 数据库:
把上述代码中的DATE_FORMAT部分替换为TO_CHAR(active_storage_blobs.created_at, 'MM/DD/YYYY')即可。
方案2:查询后在Ruby层格式化(兼容性更好,不需要适配数据库差异)
取出原始的创建时间后,通过strftime方法格式化日期:
<%= f.select :resume, options_for_select( @user.resumes.includes(:blob).references(:blob) .pluck(:filename, :created_at) .reverse .map{ |filename, created_at| "#{filename} #{created_at.strftime('%m/%d/%Y')}" } ), prompt: '-- 请选择 --', class: 'form-control' %>
补充说明
如果需要调整日期显示格式,只要修改strftime或者SQL函数里的格式参数即可,常见的格式参数参考:
%Y-%m-%d:输出形如2021-11-30的日期%m/%d/%Y:输出形如11/30/2021的日期%d/%m/%Y:输出形如30/11/2021的日期
如果你的下拉框需要把选项值设为简历的id而非文件名,可以修改pluck逻辑为:
.pluck(:id, :filename, :created_at).map{ |id, filename, created_at| ["#{filename} #{created_at.strftime('%m/%d/%Y')}", id] }
内容的提问来源于stack exchange,提问作者r3b00t
相关产品推荐
相关产品推荐

