Rails. Временная метка ActiveRecord в Epoch вместо формата DateTime.

Вам нужно хранить метки created_at и updated_at в Epoch вместо формата DateTime. Есть ли способ изменить поведение по умолчанию, имея ORM для выполнения этой задачи, чтобы сохранить метку времени.

Когда я использую Rails Generator для генерации моих моделей

class CreateTenants < ActiveRecord::Migration[5.0]
  def change
    create_table :tenants do |t|
      t.string :tenant_name
      t.string :tenant_owner_name
      t.string :tenant_address
      t.string :tenant_email
      t.integer :pincode

      t.timestamps
    end
  end
end

Не временная метка, которая переводится в DateTime.

create_table "tenants", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.string   "tenant_name"
    t.string   "tenant_owner_name"
    t.string   "tenant_address"
    t.string   "tenant_email"
    t.integer  "pincode"
    t.datetime "created_at",        null: false
    t.datetime "updated_at",        null: false
  end

Я знаю, что я могу напрямую создавать два столбца и вручную изменять поля created_at и updated_at каждый раз, когда запись добавляется/изменяется, но это будет много кода избыточного кода, представленного в приложении.

Мне нужно как-то хранить временные метки в формате эпохи (Time from 1970 in Long) вместо DateTime.

благодаря

0
06 июн. '16 в 11:15
источник поделиться
1 ответ

Вы не указали используемую БД, поэтому я предполагаю MySQL здесь. Оказывается, Rails поддерживает все варианты столбцов даты/времени для временных меток: DATE, TIME, DATETIME, TIMESTAMP и даже INTEGER. Дополнительную информацию о различиях между этими типами и данным ответом см. В документации по MySQL.

1) столбцы временной метки TIMESTAMP

Если вы хотите сохранить временные метки в TIMESTAMP столбцах типа, попробуйте следующий трюк в вашей миграции (обратите внимание на пробел в 'timestamp ', то необходимо в противном случае Rails всегда будет создавать столбец как datetime и timestamp datetime datetime вместо этого - timestamp только псевдоним для datetime в Rails):

create_table :tenants do |t|
  # ...

  #t.timestamps (remove the default timestamps definition) 
  t.column :created_at, 'timestamp ', null: false
  t.column :updated_at, 'timestamp ', null: false
end

При работе с записями отметки времени будут отображаться как обычные даты, но будут сохраняться как TIMESTAMP в БД, таким образом сохраняя несколько байтов на запись:

Tenant.create!
# => SQL (0.1ms)  INSERT INTO 'tenants' ('created_at', 'updated_at') VALUES ('2016-06-08 08:45:20', '2016-06-08 08:45:20')
=> #<Tenant id: 1, tenant_name: nil, tenant_owner_name: nil, tenant_address: nil, tenant_email: nil, pincode: nil, created_at: "2016-06-08 08:45:20", updated_at: "2016-06-08 08:45:20">

Конечно, вы всегда можете преобразовать дату и время в секундах с эпохи с to_i метода to_i:

Tenant.last.created_at.to_i
# => 1465375595

2) INTEGER временной метки INTEGER

Если вы хотите сохранить отметки времени в считанные секунды с эпохи (1970), просто определите столбцы временной метки как столбцы типа INTEGER:

create_table :tenants do |t|
  # ...

  #t.timestamps (remove the default timestamps definition)
  t.integer :created_at, null: false
  t.integer :updated_at, null: false
end

Затем метки времени в записях также отображаются как целые числа в Rails:

Tenant.create!
# => SQL (0.2ms)  INSERT INTO 'tenants' ('created_at', 'updated_at') VALUES (1465375595, 1465375595)
# => #<Tenant id: 1, tenant_name: nil, tenant_owner_name: nil, tenant_address: nil, tenant_email: nil, pincode: nil, created_at: 1465375595, updated_at: 1465375595>
+1
08 июн. '16 в 9:06
источник

Посмотрите другие вопросы по меткам или Задайте вопрос