Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #
- # File: RAILS_APP_ROOT/lib/extensions/postgres_timestamps.rb
- #
- # What: Hack up Rails/AR 3 postgresql adapter to do the following:
- #
- # 1. Always qualify timestamp types WITH TIME ZONE
- # 2. Assign DEFAULT CURRENT_TIMESTAMP to created_at, updated_at
- # 3. Assign a special updated_at trigger to tables with that column
- #
- # Note: XXX This logic assumes that a pg FUNCTION "ar_trg_updated_at()"
- # exists in the target database !!!
- #
- # See also http://stackoverflow.com/questions/5098339/activerecord-pg-support-automatic-timestamps-in-ddl
- #
- # How: This file is require'd in "config/environment.rb" if and only
- # if our connection class' ADAPTER_NAME == 'PostgreSQL'
- #
- module ActiveRecord
- module ConnectionAdapters
- class PostgreSQLAdapter
- [:datetime, :timestamp].each do |type|
- NATIVE_DATABASE_TYPES[type] = 'TIMESTAMP WITH TIME ZONE'
- end
- end
- class ColumnDefinition
- alias :original_to_sql :to_sql
- def to_sql
- if ['created_at', 'updated_at'].include?(name.to_s)
- "#{base.quote_column_name(name)} #{sql_type} DEFAULT CURRENT_TIMESTAMP"
- else
- original_to_sql
- end
- end
- end
- module SchemaStatements
- alias :original_create_table :create_table
- def create_table(table_name, options = {})
- block = Proc.new rescue Proc.new {|*args| }
- ret = original_create_table(table_name, options, &block)
- if column_exists?(table_name, :updated_at)
- execute <<-eotrigger
- CREATE TRIGGER ar_trg_updated_at
- BEFORE UPDATE
- ON #{quote_table_name(table_name)}
- FOR EACH ROW
- EXECUTE PROCEDURE ar_trg_updated_at()
- eotrigger
- end
- ret
- end
- end
- end # -- ConnectionAdapters
- end # -- ActiveRecord
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement