Ruby on rails Rails ActiveRecord时间戳采用历元格式,而不是日期时间格式

Ruby on rails Rails ActiveRecord时间戳采用历元格式,而不是日期时间格式,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,需要以历元而不是日期时间格式存储创建的时间戳和更新的时间戳。有没有一种方法可以改变默认行为,同时让ORM来维护时间戳 当我使用Rails生成器生成模型时 class CreateTenants < ActiveRecord::Migration[5.0] def change create_table :tenants do |t| t.string :tenant_name t.string :tenant_owner_name t.str

需要以历元而不是日期时间格式存储创建的时间戳和更新的时间戳。有没有一种方法可以改变默认行为,同时让ORM来维护时间戳

当我使用Rails生成器生成模型时

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
我知道我可以直接创建两列,并在每次添加/更改记录时手动更改创建的_at和更新的_at字段,但这将是应用程序中引入的大量错误代码和冗余代码

我需要的是以某种方式将时间戳存储为历元格式(从1970年开始的时间长),而不是日期时间

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

谢谢

您没有指定使用的数据库,所以我假设这里是MySQL。事实证明,Rails支持时间戳的日期/时间列的所有变体:
date
time
DATETIME
TIMESTAMP
甚至
INTEGER
。有关这些类型之间的差异以及Rails如何理解它们的更多信息,请参阅

1)
时间戳
时间戳列

如果要将时间戳存储在
TIMESTAMP
类型列中,请在迁移过程中尝试以下技巧(注意
'TIMESTAMP'
中的空格,否则Rails总是将列创建为
datetime
而不是-
TIMESTAMP
只是Rails中
datetime
的别名):

处理记录时,时间戳将显示为通常的日期时间,但将作为
TIMESTAMP
s存储在数据库中,从而为每条记录节省几个字节:

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)
整数
时间戳列

如果要将时间戳存储为自历元(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中也显示为整数:

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
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>
Tenant.create!
#=>SQL(0.2ms)插入到“租户”(在“创建”、“更新”)值(1465375595、1465375595)中
# => #

您没有指定所使用的数据库,因此我假设这里是MySQL。事实证明,Rails支持时间戳的日期/时间列的所有变体:
date
time
DATETIME
TIMESTAMP
甚至
INTEGER
。有关这些类型之间的差异以及Rails如何理解它们的更多信息,请参阅

1)
时间戳
时间戳列

如果要将时间戳存储在
TIMESTAMP
类型列中,请在迁移过程中尝试以下技巧(注意
'TIMESTAMP'
中的空格,否则Rails总是将列创建为
datetime
而不是-
TIMESTAMP
只是Rails中
datetime
的别名):

处理记录时,时间戳将显示为通常的日期时间,但将作为
TIMESTAMP
s存储在数据库中,从而为每条记录节省几个字节:

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)
整数
时间戳列

如果要将时间戳存储为自历元(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中也显示为整数:

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
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>
Tenant.create!
#=>SQL(0.2ms)插入到“租户”(在“创建”、“更新”)值(1465375595、1465375595)中
# => #

您是否尝试将您在创建的列和在更新的列定义为架构中的时间戳列?是的。但默认情况下,它采用sql日期时间格式。但是我想把它存储为Epoch而不是DateTimeSorry,也许我不明白你所说的Epoch是什么意思。自1970年以来,我以为您的意思是将列存储为秒,我猜,如果您将列定义为
timestamp
columns,那么这可能会起作用。你能详细说明你想要实现什么吗?更新了我的问题你是否尝试过将你的
created_at
Updated_at
列定义为你的模式中的
timestamp
列?是的。但默认情况下,它采用sql日期时间格式。但是我想把它存储为Epoch而不是DateTimeSorry,也许我不明白你所说的Epoch是什么意思。自1970年以来,我以为您的意思是将列存储为秒,我猜,如果您将列定义为
timestamp
columns,那么这可能会起作用。你能详细说明你到底想达到什么目的吗?更新了我的问题