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

发布于 2024-10-18 14:55:02 字数 905 浏览 1 评论 0 原文

更新(显示代码)

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

Updated (to show code)

I'd like to mimic ActiveRecord's automatic timestamps directly in the database, but without explicitly adding this logic after every migration's create_table() call.

Here's what I do now:

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

By contrast, here's what I'd like to do:

class Druthers < My::Migration::Subclass
  def self.up
    create_table :tbl do |t|
      ... some columns ...
      t.timestamps
    end
  end
end

Is there an easy or recommended way to accomplish this? Using activerecord 3, postgresql 8.4.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

末蓝 2024-10-25 14:55:02

这是迄今为止我能想到的最好的完整源代码这里

config/environment.rb< /code> 检查我们的连接适配器是否是 PostgreSQL。如果是这样,需要一个执行以下操作的文件:

  1. 包装ColumnDefinition#to_sql以强制默认值

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

  2. 包裹 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:

  1. Wrap ColumnDefinition#to_sql to force defaults

    Force "created_at" and "updated_at" to have DEFAULT CURRENT_TIMESTAMP

  2. Wrap create_table to conditionally apply the trigger

    If 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文