【发布时间】:2019-03-27 23:27:01
【问题描述】:
我试图弄清楚如何更改 t.timestamps 在 rails 迁移中使用的本机数据类型。以 postgres 结尾的默认类型是timestamp without timezone。我想要的是timestamp(0) without timezone。
我想更改本机数据类型,以便在创建新表并在迁移中使用t.timestamps 时,它会自动创建正确的时间戳数据类型。
我需要timestamp(0) without timezone,因为我的 rails 应用程序与 laravel 应用程序共享其数据库,并且两个应用程序都可以插入数据。由于 rails 不使用毫秒/laravel 的事实,并且 laravel 似乎没有办法(截至 2018-10-23)支持拥有一个包含不同格式时间戳的表(Y-m-d H:i:s.u vs Y-m-d H:i:s) 无需关闭模型中的时间戳,基本上禁用它们的自动管理,我希望数据库强制使用单一格式 (Y-m-d H:i:s)。
所以我想使用timestamp(0) 截断毫秒,而不必考虑在创建新表时正确设置表时间戳类型,因为本机类型已经是timestamp(0)
我试过了
./config/environments/initializers
require "active_record/connection_adapters/postgresql_adapter"
module ActiveRecord
module ConnectionAdapters
class PostgreSQLAdapter
NATIVE_DATABASE_TYPES.merge!(
timestamp: { name: "timestamp(0) without timezone" }
)
end
end
end
和类似的迁移
class ChangeTimestampTypesToTimestamp0 < ActiveRecord::Migration[5.2]
def change
create_table :test, id: :uuid, default: -> { "gen_random_uuid()" } do|t|
t.string :name, null: false
t.timestamps
end
end
end
但这没有用。
我还尝试更改时间戳以使用与上述迁移相同的 timestampz 作为健全性检查,但仍然没有运气...
require "active_record/connection_adapters/postgresql_adapter"
module ActiveRecord
module ConnectionAdapters
class PostgreSQLAdapter
NATIVE_DATABASE_TYPES.merge!(
timestamp: { name: "timestamptz" }
)
end
end
end
【问题讨论】:
标签: ruby-on-rails postgresql datetime timestamp