activerecord/pg:支持DDL中的自动时间戳
更新(显示代码)
我想模仿 ActiveRecord 的 自动时间戳直接在数据库中,但没有在每次迁移的create_table()
调用后显式添加此逻辑。
这就是我现在要做的:
class StatusQuo < My::Migration::Subclass
def self.up
create_table :tbl do |t|
... some columns ...
t.timestamps
end
add_default_now(:tbl, :created_at) # ALTER COLUMN ... DEFAULT NOW()
add_default_now(:tbl, :updated_at) # ALTER COLUMN ... DEFAULT NOW()
add_updated_at_trigger(:tbl) # BEFORE UPDATE ON ... trg_updated_at()
end
end
相比之下,这就是我想做的:
class Druthers < My::Migration::Subclass
def self.up
create_table :tbl do |t|
... some columns ...
t.timestamps
end
end
end
是否有一种简单或推荐的方法来完成此任务?使用activerecord 3,postgresql 8.4。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是迄今为止我能想到的最好的完整源代码这里:
在
config/environment.rb< /code> 检查我们的连接适配器是否是 PostgreSQL。如果是这样,
需要
一个执行以下操作的文件:ColumnDefinition#to_sql
以强制默认值强制“created_at”和“updated_at”具有 DEFAULT CURRENT_TIMESTAMP
create_table
以有条件地应用触发器如果新创建的表有“updated_at”列,请安装一个引用假定存在的数据库 FUNCTION 的触发器。
不太漂亮(需要在此代码之外维护 FUNCTION 定义)并且不完整(
change_table
无法正确处理引入时间戳),但已经足够好了。Here's the best I could come up with so far, full source here:
In
config/environment.rb
check to see if our connection adapter is PostgreSQL. If so,require
a file that does the following:ColumnDefinition#to_sql
to force defaultsForce "created_at" and "updated_at" to have DEFAULT CURRENT_TIMESTAMP
create_table
to conditionally apply the triggerIf the newly created table has an "updated_at" column, install a trigger referencing a database FUNCTION assumed to exist.
Not pretty (need to have maintain a FUNCTION definition outside of this code) and not complete (
change_table
won't handle introducing timestamps properly), but good enough.