Релси: време за запазване на активен запис: тип с нежелан формат

Имам periodo за извикване на таблица с атрибут час. прекарвам времето си по този начин

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

но активният запис запазва записите по този начин час: "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"

но моите записи все още запазват годината и месеца :( какво трябва да направя, за да запазя само часа и минутите???

поздравления


person Gustavo Muñoz Valenzuela    schedule 03.06.2015    source източник
comment
Не можете да спестите само час и минути. можете да запазите данните като 2 полета или да получите атрибута като форматирано време.   -  person Shalev Shalit    schedule 03.06.2015


Отговори (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

и след това заменете сетер и гетер:

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

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

Допълнително забавление

Сега има повече неща, които можете да направите. Можете например да напишете разширение simple_time на active_record, което автоматично ще предефинира сетери и гетери за списък с предадени атрибути. Можете дори да го опаковате в малък скъпоценен камък и да го направите устойчив в реалния свят (липсващи валидации, анализатори на формат на низове, обработка на _before_type_cast стойности и т.н.).

person BroiSatse    schedule 03.06.2015

@nifr 002 . Въпросът е, че всичко работи миналата седмица и успешно изчисти кеша за разработчици.
person freeze    schedule 03.06.2015