activerecord / pg:支持DDL中的自动时间戳

时间:2011-02-23 22:57:37

标签: ruby-on-rails postgresql activerecord timestamp

更新(显示代码)

我想直接在数据库中模仿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 个答案:

答案 0 :(得分:1)

到目前为止,这是我能想到的最好的,完整的来源here

config/environment.rb中检查我们的连接适配器是否是PostgreSQL。如果是,require执行以下操作的文件:

  1. 换行ColumnDefinition#to_sql以强制默认值  

    强制“created_at”和“updated_at”拥有DEFAULT CURRENT_TIMESTAMP

  2. 换行create_table以有条件地应用触发器  

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

  3. 不漂亮(需要在​​此代码之外维护FUNCTION定义)并且不完整(change_table无法正确处理时间戳),但还不错。