gpt4 book ai didi

ruby-on-rails - rails : active record saving time:type with unwanted format

转载 作者:数据小太阳 更新时间:2023-10-29 07:33:48 26 4
gpt4 key购买 nike

我有一个名为 periodo 的表,其属性为 hour。我以这种方式传递我的时间参数

hour = Time.parse( splitLine[1] ) #where splitLine[1] is my time but in string
periodo = Periodo.new(:hour => hour.strftime("%H:%M"))
periodo.save

但是active record是这样保存记录的 hour: "2000-01-01 07:00:00",我已经在/config/initializers/time_formats.rb中设置了格式

Time::DATE_FORMATS[:default] = "%H:%M"
Date::DATE_FORMATS[:default] = "%H:%M"

也在 en.yml 中

  en:
hello: "Hello world"
time:
formats:
default: "%H:%M"
date:
formats:
default: "%H:%M"

但我的记录仍在保存年和月:(我必须做些什么才能只保存小时和分钟???

问候

最佳答案

日期格式仅在您的应用程序中有效,在数据库中无效 - 它们仅负责时间对象向您的用户显示的方式,不会影响数据的存储方式。

不幸的是,数据库中没有时间这样的概念(至少我没有听说过,相信我,我确实搜索过它,因为我在当前项目中需要它)

最简单的解决方案

但是,在许多情况下,只存储事件的时间是有意义的。在当前项目中,我们决定以整数格式存储它 60 * hour + minutes。不幸的是,这是我们在项目中停止的地方。 :(

更进一步

然后您可以创建一个辅助类(只是一个脚手架 - 需要做更多工作,例如验证转换等):

class SimpleTime
attr_accessor :hour, :minute

def initialize(hour, minute)
@hour, @minute = hour, minute
end

def self.parse(integer)
return if integer.blank?
new(integer / 60, integer % 60)
end

def to_i
60 * @hour + @minute
end
end

然后覆盖 setter 和 getter:

class Model < ActiveRecord::Base
def time
@time ||= SimpleTime.parse(super)
end

def time=(value)
super(value.to_i)
end
end

更多乐趣

现在您可以做更多的事情。例如,您可以将扩展名 simple_time 写入 active_record,这将自动为传递的属性列表重新定义 setter 和 getter。您甚至可以将它包装在一个小 gem 中并使其在现实世界中得到证明(缺少验证、字符串格式解析器、处理 _before_type_cast 值等)。

关于ruby-on-rails - rails : active record saving time:type with unwanted format,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30629531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com