需要在Epoch中存储created_at和updated_at时间戳而不是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字段,但这将是应用程序中引入的大量错误代码冗余代码。 / p>
我需要的是以某种方式将时间戳以时期格式(自1970年以来的时间在Long中)存储而不是DateTime。
由于
答案 0 :(得分:1)
你没有指定使用的数据库,所以我在这里假设MySQL。事实证明,Rails支持时间戳的所有日期/时间列变体:(s.FromDate | date: 'dd-MM-yyyy') + ' To ' + (s.ToDate|date:'dd-MM-yyyy')
,DATE
,TIME
,DATETIME
甚至TIMESTAMP
。有关这些类型之间差异的详细信息,请参阅MySQL docs;有关Rails如何理解这些类型的信息,请参阅this answer。
1)INTEGER
时间戳列
如果您要将时间戳存储在TIMESTAMP
类型列中,请在迁移中尝试以下技巧(请注意TIMESTAMP
中的空格,它是{{3}否则Rails将始终以[{1}}创建列,而'timestamp '
只是Rails中datetime
的别名:
timestamp
使用记录时,时间戳将显示为通常的日期时间,但将在{DB}中存储为datetime
,从而为每条记录节省几个字节:
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">
2)to_i
时间戳列
如果您想将时间戳确实存储为自纪元以来的秒数(1970),只需将时间戳列定义为Tenant.last.created_at.to_i
# => 1465375595
类型列:
INTEGER
然后,记录中的时间戳也在Rails中显示为整数:
INTEGER