Rails: время сохранения активной записи: тип с нежелательным форматом

У меня есть период вызова таблицы с атрибутом час. я передаю свой параметр времени таким образом

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

Вы ничего не должны делать. Это соглашение ActiveRecord по хранению времени. Поэтому, если вы хотите автоматически анализировать время в своей модели из базы данных sql, вы должны хранить его так, как это делает AR. Но если вы действительно хотите хранить только часы и минуты, вам следует изменить свою схему и использовать только строку вместо даты и времени при миграции AR. Таким образом, вы можете хранить свое время таким образом. и в классе модели вы можете переопределить метод получения атрибута, например:

def some_time
  Time.parse(@some_time)
end

Затем вы можете получить проанализированный объект времени при вызове атрибута. Но на самом деле это плохой способ.

person freeze    schedule 03.06.2015