2011-02-23 46 views
2

更新(对码)的ActiveRecord/PG:支持自动时间戳在DDL

我想模仿的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。

回答

1

这是我能想出迄今最好的,完整的源here

config/environment.rb检查,看看我们的连接适配器是PostgreSQL的。如果是这样,require,做了以下文件:

  1. ColumnDefinition#to_sql强制默认

    部队“created_at”和“的updated_at”有DEFAULT CURRENT_TIMESTAMP

  2. create_table有条件地应用触发

    如果新创建的表具有“updated_at”列,请安装引用假定存在的数据库FUNCTION的触发器。

不漂亮(需要有维护这个代码之外的函数定义),而不是完整的(change_table不会正确处理引进时间戳),但不够好。