activerecord / pg: поддержка автоматических отметок времени в DDL - PullRequest
2 голосов
/ 24 февраля 2011

Обновлено (показать код)

Я бы хотел имитировать автоматические метки времени 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.

1 Ответ

1 голос
/ 25 февраля 2011

Вот лучшее, что я мог придумать, полный исходный код здесь :

В config/environment.rb проверьте, является ли наш адаптер подключения PostgreSQL. Если это так, require файл, который делает следующее:

  1. Wrap ColumnDefinition#to_sql для принудительного использования значений по умолчанию

    Принудительно заставляет "selected_at" и "updated_at" иметь DEFAULT CURRENT_TIMESTAMP

  2. Wrap create_table для условного применения триггера

    Если вновь созданная таблица имеет столбец updated_at, установите триггер, ссылающийся на ФУНКЦИЮ базы данных, которая предположительно существует.

Не симпатично (нужно поддерживать определение FUNCTION вне этого кода) и не завершено (change_table не справится с введением временных меток должным образом), но достаточно хорошо.

...