Rails:活动记录保存时间:键入不需要的格式

时间:2015-06-03 19:59:44

标签: ruby-on-rails ruby activerecord time

我有一个带有属性hour的表调用periodo。我以这种方式传递我的时间参数

$ids = productsLoop($args);
// you can use the $ids variable now, for example...
foreach ($ids as $id) {
    echo $id . '<br>';
}

但是活动记录以这种方式保存记录小时:“2000-01-01 07:00:00”,我已经在/config/initializers/time_formats.rb中设置了格式

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

,也在en.yml中

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

但是我的记录仍在保存年份和月份:(我只需要保存小时和分钟???

问候

2 个答案:

答案 0 :(得分:2)

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

不幸的是,没有像时间这样的概念只在数据库中存在(至少我没有听说过任何一个,相信我,我确实在我目前的项目中需要它时搜索它)

最简单的解决方案

但是,在许多情况下,仅存储事件的时间是有意义的。在当前项目中,我们决定以整数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以获取传递的属性列表。您甚至可以将它包装在一个小宝石中,并使其真实世界(缺少验证,字符串格式解析器,处理_before_type_cast值等)。

答案 1 :(得分:1)

你必须什么都不做。这是关于时间存储的activerecord约定。因此,如果您希望从sql数据库中自动解析模型中的时间,则必须按照AR的方式存储它。但是如果你真的只想存储几小时和几分钟,你应该改变你的方案,在AR迁移中只使用字符串而不是datetime。所以你可以这样存储你的时间。在模型类中,您可以覆盖属性getter,如:

def some_time
  Time.parse(@some_time)
end

然后,当调用属性时,您可以获得解析的时间对象。但实际上这是一种糟糕的方式。