Ruby on Rails合并date与time值后赋值给对象不保存如何解决
问题原因
你数据库中events表的time字段使用的是time类型,该类型仅存储时分秒数据,不包含年月日信息。当你将拼接了正确日期的DateTime对象赋值给该字段时,Rails会自动丢弃日期部分,仅保留时分秒,读取该字段时会默认拼接2000-01-01作为默认日期,因此会出现赋值不生效的表现。
解决建议
方案1:修改字段类型(最推荐)
直接将time字段的类型从time调整为datetime,就能完整存储拼接好的完整日期时间数据,原有业务逻辑无需额外修改即可正常运行。
你可以通过以下步骤修改字段:
- 生成迁移文件:
rails generate migration ChangeTimeTypeToDatetimeInEvents
- 编辑生成的迁移文件内容:
class ChangeTimeTypeToDatetimeInEvents < ActiveRecord::Migration[7.0] # 版本号匹配你项目的Rails版本即可 def change change_column :events, :time, :datetime end end
- 执行迁移:
rails db:migrate
方案2:保留现有字段,新增拼接方法
如果因为业务限制无法修改字段类型,可以在Event模型中新增自定义方法,使用时自动拼接日期和时间:
class Event < ApplicationRecord # 原有模型代码... # 获取拼接了日期的完整时间 def full_datetime time.change(year: date.year, month: date.month, day: date.day) end end
后续需要使用完整时间的场景直接调用@event.full_datetime即可,不需要在create方法中做赋值操作。
内容的提问来源于stack exchange,提问作者MarCarrot
相关产品推荐
相关产品推荐

