更新(显示代码)
我想直接在数据库中模仿ActiveRecord的automatic timestamps,但在每次迁移的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。
答案 0 :(得分:1)
到目前为止,这是我能想到的最好的,完整的来源here:
在config/environment.rb
中检查我们的连接适配器是否是PostgreSQL。如果是,require
执行以下操作的文件:
ColumnDefinition#to_sql
以强制默认值
强制“created_at”和“updated_at”拥有DEFAULT CURRENT_TIMESTAMP
create_table
以有条件地应用触发器
如果新创建的表具有“updated_at”列,请安装引用假定存在的数据库FUNCTION的触发器。
不漂亮(需要在此代码之外维护FUNCTION定义)并且不完整(change_table
无法正确处理时间戳),但还不错。