Rails: создание временного столбца с часовым поясом на postgres

У меня есть приложение rails, которое работает с postgres db. У меня есть модель под названием UserTimings, где есть два поля from_time и to_time.

t.time     "from_time"
t.time     "to_time"

Я ожидал, что время будет сохранено в полном формате UTC с информацией о часовом поясе. Через некоторое время я понял, что база данных имеет такой SQL-запрос для создания таблицы.

from_time time without time zone,
to_time time without time zone,

Я не хочу этого. Я хочу сохранить с часовым поясом. Я хочу, чтобы +0530 в UTC время, которое я не получаю, хотя приложение rails настроено для его обработки. Скажите, пожалуйста, как написать миграцию, чтобы заставить db использовать часовой пояс.

Спасибо.

Ответ 1

Эта миграция делает именно то, что вы хотите

class CreatePeppers < ActiveRecord::Migration
  def change
    create_table :peppers do |t|
      t.column :runs, 'timestamp with time zone'
      t.column :stops, 'time with time zone'
    end
  end
end

Типы для вашего выбора. Вы можете написать здесь любой тип, который поддерживает postgresql. Но могут возникнуть проблемы с преобразованием типов, которые могут понять рельсы.

Ответ 2

Вы, кажется, путаетесь о двух разных вещах здесь - как об общих ошибках, почти каждый делает хотя бы один из них.

Во-первых, "формат UTC с информацией о часовом поясе" не указывает время. Он указывает время и место.

Во-вторых, "временная метка времени" PostgreSQL на самом деле не хранит часовой пояс. Он хранит временную метку UTC, но принимает часовой пояс. Лучшим выбором названия было бы нечто вроде "абсолютного времени". Вы можете сравнить два из этих значений напрямую.

Временная метка без часовой пояс фактически не дает вам времени, если у вас также нет места. Вы не можете сравнить два из них, если не знаете, в какой временной зоне каждый находится.

Похоже на то, что вы хотите, это временная метка без часового пояса и отдельный часовой пояс. Таким образом, вы можете сказать "2 вечера во вторник, Лондонское время".

Ответ 3

Не уверен, что это то, чего вы хотите, но это работает для меня:

add_column :table, :from_time, :timetz
add_column :table, :to_time, :timetz

Но рельсы, похоже, не могут распознать тип timetz, это будет рассматриваться как String. Чтобы обойти это, я регистрирую timetz как время.

ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
  def initialize_type_map_with_postgres_oids mapping
    initialize_type_map_without_postgres_oids mapping
    register_class_with_limit mapping, 'timetz',
                              ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID::Time
  end

  alias_method_chain :initialize_type_map, :postgres_oids
end

Кстати, моя среда - рельсы-4.2