2016-06-06 18 views
0

Müssen created_at und update_at Zeitstempel in Epoch statt DateTime Format gespeichert werden. Gibt es eine Möglichkeit, das Standardverhalten zu ändern, während ORM dafür zuständig ist, den Zeitstempel zu verwalten.Rails ActiveRecord Timestamp in Epoch anstelle von DateTime Format

Wenn ich Rails Generator meiner Modelle erzeugen

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 

Nicht der Zeitstempel, die Datetime übersetzt.

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 

Ich weiß, dass ich direkt zwei Spalten erstellen und manuell die created_at verändern und updated_at Felder bei jedem Besuch der Datensatz hinzugefügt wird/geändert, aber das wird in der Anwendung eingeführt viele schlechte Code redundanten Code sein.

Was ich brauche ist, die Zeitstempel im Epochformat (Zeit seit 1970 in Long) statt DateTime irgendwie zu speichern.

Dank

+0

Haben Sie versucht, Ihre 'created_at'- und' updated_at'-Spalten als 'timestamp'-Spalten in Ihrem Schema zu definieren? – BoraMa

+0

Ja.Aber standardmäßig wird das Format sql datetime verwendet. Aber ich möchte es als Epoch anstelle von DateTime speichern –

+0

Sorry, vielleicht verstehe ich nicht, was du mit Epoch meinst. Ich dachte, Sie wollten die Spalten seit 1970 als Sekunden speichern, und das könnte, denke ich, nur funktionieren, wenn Sie die Spalten als Zeitstempel definieren. Können Sie näher erläutern, was genau Sie erreichen möchten? – BoraMa

Antwort

1

Sie haben die DB verwendet nicht angegeben, so nehme ich an hier MySQL. Es stellt sich heraus, dass Rails alle Varianten von Datums-/Uhrzeitspalten für die Zeitstempel unterstützt: DATE, TIME, , TIMESTAMP und sogar INTEGER. Weitere Informationen zu den Unterschieden zwischen diesen Typen und this answer finden Sie unter MySQL docs für Informationen darüber, wie Rails sie verstehen.

1) TIMESTAMP timestamp-Spalten

Wenn Sie die Zeitstempel in TIMESTAMP Typ Spalten speichern möchten, versuchen Sie die folgenden Trick, in der Migration (man beachte den Raum in 'timestamp ' ist es needed sonst Rails wird immer erstellen die Spalte als datetime statt - timestamp nur ein Alias ​​für datetime in Rails ist):

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 

Wenn mit den Datensätzen arbeiten, werden die Zeitstempel als üblich Datetimes erscheinen aber als TIMESTAMP s in der DB gespeichert werden, so dass ein paar Bytes pro Datensatz gespeichert:

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"> 

Natürlich können Sie immer ein Datetime konvertieren In den Sekunden seit der Epoche mit der to_i Methode:

Tenant.last.created_at.to_i 
# => 1465375595 

2) INTEGER timestamp-Spalten

Wenn Sie speichern möchten die Zeitstempel in der Tat als Sekunden seit der Epoche (1970), um nur die Zeitstempel-Spalten als INTEGER Typ Spalten definieren:

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 

Dann wurde die Zeitstempel in den Aufzeichnungen auch als ganze Zahlen in Rails erscheinen:

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> 
Verwandte Themen