View difference between Paste ID: YGdfwrZS and
SHOW:
|
|
- or go back to the newest paste.
1 | - | |
1 | + | # |
2 | # File: RAILS_APP_ROOT/lib/extensions/postgres_timestamps.rb | |
3 | # | |
4 | # What: Hack up Rails/AR 3 postgresql adapter to do the following: | |
5 | # | |
6 | # 1. Always qualify timestamp types WITH TIME ZONE | |
7 | # 2. Assign DEFAULT CURRENT_TIMESTAMP to created_at, updated_at | |
8 | # 3. Assign a special updated_at trigger to tables with that column | |
9 | # | |
10 | # Note: XXX This logic assumes that a pg FUNCTION "ar_trg_updated_at()" | |
11 | # exists in the target database !!! | |
12 | # | |
13 | # See also http://stackoverflow.com/questions/5098339/activerecord-pg-support-automatic-timestamps-in-ddl | |
14 | # | |
15 | # How: This file is require'd in "config/environment.rb" if and only | |
16 | # if our connection class' ADAPTER_NAME == 'PostgreSQL' | |
17 | # | |
18 | ||
19 | module ActiveRecord | |
20 | module ConnectionAdapters | |
21 | ||
22 | class PostgreSQLAdapter | |
23 | [:datetime, :timestamp].each do |type| | |
24 | NATIVE_DATABASE_TYPES[type] = 'TIMESTAMP WITH TIME ZONE' | |
25 | end | |
26 | end | |
27 | ||
28 | class ColumnDefinition | |
29 | alias :original_to_sql :to_sql | |
30 | def to_sql | |
31 | if ['created_at', 'updated_at'].include?(name.to_s) | |
32 | "#{base.quote_column_name(name)} #{sql_type} DEFAULT CURRENT_TIMESTAMP" | |
33 | else | |
34 | original_to_sql | |
35 | end | |
36 | end | |
37 | end | |
38 | ||
39 | module SchemaStatements | |
40 | alias :original_create_table :create_table | |
41 | def create_table(table_name, options = {}) | |
42 | block = Proc.new rescue Proc.new {|*args| } | |
43 | ret = original_create_table(table_name, options, &block) | |
44 | if column_exists?(table_name, :updated_at) | |
45 | execute <<-eotrigger | |
46 | CREATE TRIGGER ar_trg_updated_at | |
47 | BEFORE UPDATE | |
48 | ON #{quote_table_name(table_name)} | |
49 | FOR EACH ROW | |
50 | EXECUTE PROCEDURE ar_trg_updated_at() | |
51 | eotrigger | |
52 | end | |
53 | ret | |
54 | end | |
55 | end | |
56 | ||
57 | end # -- ConnectionAdapters | |
58 | end # -- ActiveRecord |