activerecord-cached_at 5.1.0 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c9738b748326936b6c9ca40a335f3ff903ddbdb2
4
- data.tar.gz: d2a4acd817f4f27deaa58984ab285946c711dbd8
2
+ SHA256:
3
+ metadata.gz: 89f6c8c10ca1cb627c057112961cb80ff26440026b723b5cf4240e4873089604
4
+ data.tar.gz: 05374e1138987e67d9a0fb5866278f1d495168799859ccb8cc77e4bc8dc8b724
5
5
  SHA512:
6
- metadata.gz: 0b16e4afd909f8091721348e23d54f2d71427bcb550016d77677574bb19a525c2f12cb8fbccb25b1de39d82604f954be5674ec7e99611bfb0e776c21398bdcb0
7
- data.tar.gz: 49bc4f9883cd48034e0dcad03b8525e750dd59244e143946d3c33b4f88a54d19705183b69492dba045dee6dc9e4729ca9b144817603ce718f734a11b3b671f0e
6
+ metadata.gz: 2053953fe7212f64ee1d03ed6956f409f25ae3c53666c25acd7224ecefa3e8ed0b1d2daf99317087d7c7fed0ea846a10eceec4de9776c31c530f31bc518b54ab
7
+ data.tar.gz: fbeed1272d1d6a5961733ec128516a5b1dc9f093061775c24ba1c14c30bf28f8730436542d8ca45de738a41d957332fd5daf133d74d54c37b9f6f9db137c7eff
data/README.md CHANGED
@@ -1,15 +1,16 @@
1
- # ActiveRecord - CachedAt
1
+ # ActiveRecord - CachedAt [![Travis CI](https://travis-ci.org/malomalo/activerecord-cached_at.svg?branch=master)](https://travis-ci.org/malomalo/activerecord-cached_at)
2
2
 
3
3
  This gem causes ActiveRecord to update a `cached_at` column if present, like the
4
4
  `updated_at` column.
5
5
 
6
6
  When calculating a `cache_key` for a model it will also consider the `cached_at`
7
- column to determin the key of a model.
7
+ column to determine the key of a model.
8
8
 
9
9
  Any `ActiveRecord::Migration` that calls `timestamps` will include a `cached_at`
10
10
  column.
11
11
 
12
- TODO: Document about relationship caches
12
+ Call to [`ActiveRecord::Persistence::touch`](https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-touch)
13
+ will also touch the `cached_at` column.
13
14
 
14
15
  ## Installation
15
16
 
@@ -22,12 +23,94 @@ aren't updating the models you can just require the helpers:
22
23
 
23
24
  gem 'activerecord-cached_at', require: 'cached_at/helpers'
24
25
 
26
+ ## Configuration
25
27
 
28
+ By default updates to the `cached_at`, `updated_at`, and `created_at` columns
29
+ will not trigger and update to the `cached_at` column. You can add aditional
30
+ fields to ignore:
31
+
32
+ ```ruby
33
+ class User
34
+ cached_at ignore: :my_column
35
+ end
36
+
37
+ class Photo
38
+ cached_at ignore: :column_a, :column_b
39
+ end
40
+ ```
41
+ ## Relationship Cache Keys
42
+
43
+ CachedAt also allows you to keep cache keys for relationships. This allows you
44
+ to use the record to determine if a cache is valid for a relationship instead
45
+ of doing another database query.
46
+
47
+ For example:
48
+
49
+ ```ruby
50
+ class User < ActiveRecord::Base
51
+ has_many :photos
52
+ end
53
+
54
+ class Photo
55
+ belongs_to :user, cached_at: true
56
+ end
57
+
58
+ bob_ross = User.create(name: 'Bob Ross')
59
+ # => INSERT INTO "users"
60
+ # ("name", "cached_at", "updated_at_", "created_at")
61
+ # VALUES
62
+ # ("Bob Ross", "2020-07-19 20:22:03", "2020-07-19 20:22:03", "2020-07-19 20:22:03")
63
+
64
+ photo = Photo.create(user: bob_ross, file: ...)
65
+ # =>INSERT INTO "photos" ("user_id", "cached_at", "updated_at_", "created_at") VALUES (1, "Bob Ross", "2020-07-19 20:22:04", "2020-07-19 20:22:04", "2020-07-19 20:22:04")
66
+ # => UPDATE "users" SET "photos_cached_at" = "2020-07-19 20:22:04" WHERE "users"."id" = 1
67
+
68
+ photo.update(file: ...)
69
+ # =>UPDATE "photos" (..., "cached_at", "updated_at_") VALUES (..., "2020-07-19 20:22:05", "2020-07-19 20:22:05", "2020-07-19 20:22:05")
70
+ # => UPDATE "users" SET "photos_cached_at" = "2020-07-19 20:22:05" WHERE "users"."id" = 1
71
+
72
+ photo.update(user: not_bob_ross)
73
+ # =>UPDATE "photos" ("user_id", "cached_at", "updated_at_") VALUES (2, "2020-07-19 20:22:06", "2020-07-19 20:22:06", "2020-07-19 20:22:06")
74
+ # => UPDATE "users" SET "photos_cached_at" = "2020-07-19 20:22:06" WHERE "users"."id" IN (1, 2)
75
+
76
+ photo.destroy
77
+ # => UPDATE "users" SET "photos_cached_at" = "2020-07-19 20:22:07" WHERE "users"."id" = 2
78
+ # => DELETE FROM "users" WHERE WHERE "users"."id" = 2
79
+ ```
80
+
81
+ # Usage
82
+
83
+ `cached_at` will automatically be used for determining the cache key in Rails.
84
+
85
+ However if you need to calculate the cache key based on relationship cache keys
86
+ you will need to manually compute the cache key. Examples are below:
87
+
88
+ The cache key here is the maxium of the following keys: `cached_at`,
89
+ `listings_cached_at`, and `photos_cached_at`
90
+
91
+ ```erb
92
+ <%= render partial: 'row', collection: @properties, as: :property, cached: Proc.new { |item|
93
+ [item.cache_key_with_version(:listings, :photos), current_account.id ]
94
+ } %>
95
+
96
+ <% cache @property.cache_key_with_version(:listings, :photos) do %>
97
+ <b>All the info on this property</b>
98
+ <%= @property.name %>
99
+ <% @property.listings.each do |listing| %>
100
+ <%= listing.info %>
101
+ <% end %>
102
+ <% @property.photos.each do |photo| %>
103
+ <%= image_tag(photo.url) %>
104
+ <% end %>
105
+ <% end %>
106
+
107
+ ```
26
108
  ## TODO:
27
109
 
28
- Add a `cache_key` method to the Model class that gets `MAX(cached_at)`
110
+ * Document going more than one level with cached_at keys
29
111
 
112
+ * Add a `cache_key` method to the Model class that gets `MAX(cached_at)`
30
113
 
114
+ * change option to cache: true
31
115
 
32
- change option to cache: true
33
- add cache_association helper
116
+ * add cache_association helper
@@ -2,14 +2,16 @@ module ActiveRecord
2
2
  module ConnectionAdapters #:nodoc:
3
3
 
4
4
  class TableDefinition
5
- def timestamps(*args)
6
- options = args.extract_options!
7
-
5
+ def timestamps(**options)
8
6
  options[:null] = false if options[:null].nil?
9
7
 
10
- column(:created_at, :datetime, options)
11
- column(:updated_at, :datetime, options)
12
- column(:cached_at, :datetime, options)
8
+ if !options.key?(:precision) && @conn.supports_datetime_with_precision?
9
+ options[:precision] = 6
10
+ end
11
+
12
+ column(:created_at, :datetime, **options)
13
+ column(:updated_at, :datetime, **options)
14
+ column(:cached_at, :datetime, **options)
13
15
  end
14
16
  end
15
17
 
@@ -2,19 +2,42 @@ module ActiveRecord
2
2
  module ConnectionAdapters #:nodoc:
3
3
 
4
4
  module SchemaStatements
5
- def add_timestamps(table_name, options = {})
5
+ def add_timestamps(table_name, **options)
6
6
  options[:null] = false if options[:null].nil?
7
7
 
8
- add_column table_name, :created_at, :datetime, options
9
- add_column table_name, :updated_at, :datetime, options
10
- add_column table_name, :cached_at, :datetime, options
8
+ if !options.key?(:precision) && supports_datetime_with_precision?
9
+ options[:precision] = 6
10
+ end
11
+
12
+ add_column table_name, :created_at, :datetime, **options
13
+ add_column table_name, :updated_at, :datetime, **options
14
+ add_column table_name, :cached_at, :datetime, **options
11
15
  end
12
16
 
13
- def remove_timestamps(table_name, options = {})
17
+ def remove_timestamps(table_name, **options)
14
18
  remove_column table_name, :updated_at
15
19
  remove_column table_name, :created_at
16
20
  remove_column table_name, :cached_at
17
21
  end
22
+
23
+ def add_timestamps_for_alter(table_name, **options)
24
+ options[:null] = false if options[:null].nil?
25
+
26
+ if !options.key?(:precision) && supports_datetime_with_precision?
27
+ options[:precision] = 6
28
+ end
29
+
30
+ [
31
+ add_column_for_alter(table_name, :created_at, :datetime, **options),
32
+ add_column_for_alter(table_name, :updated_at, :datetime, **options),
33
+ add_column_for_alter(table_name, :cached_at, :datetime, **options)
34
+ ]
35
+ end
36
+
37
+ def remove_timestamps_for_alter(table_name, **options)
38
+ remove_columns_for_alter(table_name, :updated_at, :created_at, :cached_at)
39
+ end
40
+
18
41
  end
19
42
 
20
43
  end
@@ -3,5 +3,5 @@ require 'active_record'
3
3
  require File.expand_path(File.join(__FILE__, '../cached_at/base'))
4
4
  require File.expand_path(File.join(__FILE__, '../cached_at/helpers'))
5
5
  require File.expand_path(File.join(__FILE__, '../cached_at/timestamp'))
6
- require File.expand_path(File.join(__FILE__, '../cached_at/connection_adapters/abstract/schema_definitions'))
7
- require File.expand_path(File.join(__FILE__, '../cached_at/connection_adapters/abstract/schema_statements'))
6
+ require File.expand_path(File.join(__FILE__, '../../ext/active_record/connection_adapters/abstract/schema_definitions'))
7
+ require File.expand_path(File.join(__FILE__, '../../ext/active_record/connection_adapters/abstract/schema_statements'))
@@ -41,7 +41,7 @@ module CachedAt
41
41
 
42
42
  source_assoc = owner.association(r.source_reflection_name.to_sym)
43
43
  if source_assoc.loaded?
44
- source_assoc.target.raw_write_attribute(cache_column, timestamp)
44
+ source_assoc.target.send(:write_attribute_without_type_cast, cache_column, timestamp)
45
45
  end
46
46
  query = r.klass.where(r.association_primary_key => owner.send(r.foreign_key))
47
47
  query.update_all({ cache_column => timestamp })
@@ -45,7 +45,7 @@ module CachedAt
45
45
  end
46
46
 
47
47
  if loaded? && target
48
- target.raw_write_attribute(cache_column, timestamp)
48
+ target.send(:write_attribute_without_type_cast, cache_column, timestamp)
49
49
  end
50
50
  end
51
51
 
@@ -54,7 +54,7 @@ module CachedAt
54
54
  timestamp = Time.now
55
55
  cache_column = "#{options[:inverse_of]}_cached_at"
56
56
  if loaded? && target
57
- target.raw_write_attribute(cache_column, timestamp)
57
+ target.send(:write_attribute_without_type_cast, cache_column, timestamp)
58
58
  end
59
59
  end
60
60
 
@@ -12,9 +12,11 @@ module CachedAt
12
12
  cache_column = "#{reflection.inverse_of.name}_cached_at"
13
13
  ids = [owner.send(reflection.association_primary_key), owner.send("#{reflection.association_primary_key}_before_last_save")].compact.uniq
14
14
  query = klass.where({ reflection.foreign_key => ids })
15
-
15
+
16
16
  if loaded?
17
- target.each { |r| r.raw_write_attribute(cache_column, timestamp) }
17
+ target.each do |record|
18
+ record.send(:write_attribute_without_type_cast, cache_column, timestamp)
19
+ end
18
20
  end
19
21
 
20
22
  if method != :destroy
@@ -40,14 +42,14 @@ module CachedAt
40
42
 
41
43
  cache_column = "#{reflection.inverse_of.name}_cached_at"
42
44
 
43
- records.each { |r| r.raw_write_attribute(cache_column, timestamp) unless r.destroyed? }
45
+ records.each { |r| r.send(:write_attribute_without_type_cast, cache_column, timestamp) unless r.destroyed? }
44
46
 
45
47
  query = klass.where({ klass.primary_key => records.map(&:id) })
46
48
  query.update_all({ cache_column => timestamp })
47
49
  traverse_relationships(klass, options[:cached_at], query, cache_column, timestamp)
48
50
  end
49
51
 
50
- def add_to_target(record, skip_callbacks = false, &block)
52
+ def add_to_target(record, skip_callbacks: false, replace: false, &block)
51
53
  value = super
52
54
  touch_records_cached_at([record], Time.now) if !(instance_variable_defined?(:@caching) && @caching)
53
55
  value
@@ -15,7 +15,7 @@ module CachedAt
15
15
 
16
16
  query = nil
17
17
  if loaded?
18
- target.each { |r| r.raw_write_attribute(cache_column, timestamp) }
18
+ target.each { |r| r.send(:write_attribute_without_type_cast, cache_column, timestamp) }
19
19
  query = klass.where(klass.primary_key => target.map(&:id))
20
20
  else
21
21
  ids = [owner.send(using_reflection.association_primary_key), owner.send("#{using_reflection.association_primary_key}_before_last_save")].compact.uniq
@@ -35,7 +35,7 @@ module CachedAt
35
35
  #TODO: test with new record (fails in mls)
36
36
  if !owner.new_record? && using_reflection.inverse_of && using_reflection.inverse_of.options[:cached_at]
37
37
  cache_column = "#{using_reflection.name}_cached_at"
38
- owner.raw_write_attribute(cache_column, timestamp)
38
+ owner.send(:write_attribute_without_type_cast, cache_column, timestamp)
39
39
  owner.update_columns(cache_column => timestamp)
40
40
  end
41
41
  end
@@ -50,7 +50,7 @@ module CachedAt
50
50
  end
51
51
 
52
52
  cache_column = "#{using_reflection.inverse_of.name}_cached_at"
53
- records.each { |r| r.raw_write_attribute(cache_column, timestamp) }
53
+ records.each { |r| r.send(:write_attribute_without_type_cast, cache_column, timestamp) }
54
54
  query = klass.where(klass.primary_key => records.map(&:id))
55
55
  query.update_all({ cache_column => timestamp })
56
56
  traverse_relationships(klass, using_reflection.options[:cached_at], query, cache_column, timestamp)
@@ -24,7 +24,7 @@ module CachedAt
24
24
  end
25
25
 
26
26
  if loaded? && target
27
- target.raw_write_attribute(cache_column, timestamp)
27
+ target.send(:write_attribute_without_type_cast, cache_column, timestamp)
28
28
  end
29
29
  end
30
30
 
@@ -13,24 +13,38 @@ module CachedAt
13
13
  extend ActiveSupport::Concern
14
14
 
15
15
  included do
16
+ class_attribute :cached_at_settings, default: {ignore: ['cached_at', 'updated_at', 'created_at']}
17
+ before_save :set_cached_at
16
18
  before_save :update_belongs_to_cached_at_keys
17
19
  before_destroy { update_relations_cached_at(method: :destroy) }
18
20
 
19
21
  after_touch { update_relations_cached_at_from_cached_at(method: :touch) }
20
- after_save :update_relations_cached_at_from_cached_at
22
+ after_save :update_relations_cached_at_from_cached_at
23
+ end
24
+
25
+ class_methods do
26
+ def cached_at(ignore: [])
27
+ ignore = [ignore] if !ignore.is_a?(Array)
28
+ self.cached_at_settings[:ignore].push(*ignore.map(&:to_s))
29
+ end
30
+ end
31
+
32
+ def touch(*names, time: nil)
33
+ names.push('cached_at')
34
+ super(*names, time: time)
21
35
  end
22
36
 
23
37
  private
24
38
 
25
39
  def update_relations_cached_at_from_cached_at(method: nil)
26
- update_relations_cached_at({
40
+ update_relations_cached_at(
27
41
  timestamp: (self.class.column_names.include?('cached_at') ? cached_at : nil),
28
42
  method: method
29
- })
43
+ )
30
44
  end
31
45
 
32
46
  def update_relations_cached_at(timestamp: nil, method: nil)
33
- method = instance_variable_defined?(:@new_record_before_save) && @new_record_before_save ? :create : :update if method.nil?
47
+ method = @_new_record_before_last_commit ? :create : :update if method.nil?
34
48
 
35
49
  diff = saved_changes.transform_values(&:first)
36
50
  return if method == :create && diff.empty?
@@ -49,22 +63,30 @@ module CachedAt
49
63
  end
50
64
  end
51
65
 
66
+ def set_cached_at
67
+ return if !self.class.column_names.include?('cached_at')
68
+ diff = changes.transform_values(&:first)
69
+ return if diff.keys.all? { |k| cached_at_settings[:ignore].include?(k) }
70
+
71
+ self.cached_at = current_time_from_proper_timezone
72
+ end
73
+
52
74
  def update_belongs_to_cached_at_keys
53
75
  self.class.reflect_on_all_associations.each do |reflection|
54
76
  next unless reflection.is_a?(ActiveRecord::Reflection::BelongsToReflection)
55
77
  cache_column = "#{reflection.name}_cached_at"
56
78
 
57
79
  if self.attribute_names.include?(cache_column)
58
- if self.changes.has_key?(reflection.foreign_key) && self.changes[reflection.foreign_key][1].nil?
80
+ if self.changes_to_save.has_key?(reflection.foreign_key) && self.changes_to_save[reflection.foreign_key][1].nil?
59
81
  self.assign_attributes({ cache_column => current_time_from_proper_timezone })
60
- elsif (self.changes[reflection.foreign_key] || self.new_record? || (self.association(reflection.name).loaded? && self.send(reflection.name) && self.send(reflection.name).id.nil?)) && self.send(reflection.name).try(:cached_at)
82
+ elsif (self.changes_to_save[reflection.foreign_key] || self.new_record? || (self.association(reflection.name).loaded? && self.send(reflection.name) && self.send(reflection.name).id.nil?)) && self.send(reflection.name).try(:cached_at)
61
83
  self.assign_attributes({ cache_column => self.send(reflection.name).cached_at })
62
84
  end
63
85
  end
64
86
 
65
87
  end
66
88
  end
67
-
89
+
68
90
  end
69
91
  end
70
92
 
@@ -29,16 +29,40 @@ module CachedAt
29
29
 
30
30
  end
31
31
 
32
- def cache_key(includes = nil)
32
+ def cache_key(*includes)
33
33
  if includes.nil? || includes.empty?
34
- super
34
+ if cache_versioning
35
+ "#{model_name.cache_key}/#{id}"
36
+ else
37
+ "#{model_name.cache_key}/#{id}@#{cache_version}"
38
+ end
39
+ else
40
+ digest = Digest::MD5.hexdigest(paramaterize_cache_includes(includes))
41
+ if cache_versioning
42
+ "#{model_name.cache_key}/#{id}+#{digest}"
43
+ else
44
+ "#{model_name.cache_key}/#{id}+#{digest}@#{cache_version(includes)}"
45
+ end
46
+ end
47
+ end
48
+
49
+ def cache_key_with_version(*includes)
50
+ if version = cache_version(*includes)
51
+ "#{cache_key(*includes)}-#{version}"
52
+ else
53
+ cache_key(*includes)
54
+ end
55
+ end
56
+
57
+ def cache_version(*includes)
58
+ timestamp = if includes.empty?
59
+ try(:cached_at) || try(:cached_at)
35
60
  else
36
61
  timestamp_keys = ['cached_at'] + self.class.cached_at_columns_for_includes(includes)
37
- timestamp = max_updated_column_timestamp(timestamp_keys).utc.to_s(cache_timestamp_format)
38
- digest ||= Digest::MD5.new()
39
- digest << paramaterize_cache_includes(includes)
40
- "#{model_name.cache_key}/#{id}+#{digest.hexdigest}@#{timestamp}"
62
+ timestamp = timestamp_keys.map { |attr| self[attr]&.to_time }.compact.max
41
63
  end
64
+
65
+ timestamp.utc.to_s(:usec)
42
66
  end
43
67
 
44
68
  # TODO
@@ -84,4 +108,4 @@ module CachedAt
84
108
  end
85
109
  end
86
110
 
87
- ActiveRecord::Base.include(CachedAt::Base::Helpers)
111
+ ActiveRecord::Base.include(CachedAt::Base::Helpers)
@@ -7,11 +7,13 @@ module ActiveRecord
7
7
  private
8
8
 
9
9
  def timestamp_attributes_for_update
10
- ['updated_at', 'cached_at']
10
+ ["updated_at", "updated_on", 'cached_at'].map! { |name| attribute_aliases[name] || name }
11
11
  end
12
12
 
13
13
  def timestamp_attributes_for_create
14
- ['created_at', 'udpated_at', 'cached_at'] + column_names.select{|c| c.end_with?('_cached_at') }
14
+ (['created_at', 'udpated_at', 'cached_at'] + column_names.select{|c| c.end_with?('_cached_at') }).map! do |name|
15
+ attribute_aliases[name] || name
16
+ end
15
17
  end
16
18
 
17
19
  end
@@ -1,3 +1,3 @@
1
1
  module CachedAt
2
- VERSION = '5.1.0'
2
+ VERSION = '6.1.0'
3
3
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-cached_at
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 6.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Bracy
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-28 00:00:00.000000000 Z
11
+ date: 2021-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 5.1.0
19
+ version: 6.1.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 5.1.0
26
+ version: 6.1.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -143,8 +143,6 @@ files:
143
143
  - lib/cached_at/associations/has_many_through_association.rb
144
144
  - lib/cached_at/associations/has_one_association.rb
145
145
  - lib/cached_at/base.rb
146
- - lib/cached_at/connection_adapters/abstract/schema_definitions.rb
147
- - lib/cached_at/connection_adapters/abstract/schema_statements.rb
148
146
  - lib/cached_at/helpers.rb
149
147
  - lib/cached_at/reflections/abstract_reflection.rb
150
148
  - lib/cached_at/timestamp.rb
@@ -153,7 +151,7 @@ homepage: https://github.com/malomalo/activerecord-cached_at
153
151
  licenses:
154
152
  - MIT
155
153
  metadata: {}
156
- post_install_message:
154
+ post_install_message:
157
155
  rdoc_options:
158
156
  - "--main"
159
157
  - README.md
@@ -170,9 +168,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
170
168
  - !ruby/object:Gem::Version
171
169
  version: '0'
172
170
  requirements: []
173
- rubyforge_project:
174
- rubygems_version: 2.6.11
175
- signing_key:
171
+ rubygems_version: 3.2.3
172
+ signing_key:
176
173
  specification_version: 4
177
174
  summary: Allows ActiveRecord and Rails to use a `cached_at` column for the `cache_key`
178
175
  if available
@@ -1,17 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters #:nodoc:
3
-
4
- class TableDefinition
5
- def timestamps(*args)
6
- options = args.extract_options!
7
-
8
- options[:null] = false if options[:null].nil?
9
-
10
- column(:created_at, :datetime, options)
11
- column(:updated_at, :datetime, options)
12
- column(:cached_at, :datetime, options)
13
- end
14
- end
15
-
16
- end
17
- end
@@ -1,21 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters #:nodoc:
3
-
4
- module SchemaStatements
5
- def add_timestamps(table_name, options = {})
6
- options[:null] = false if options[:null].nil?
7
-
8
- add_column table_name, :created_at, :datetime, options
9
- add_column table_name, :updated_at, :datetime, options
10
- add_column table_name, :cached_at, :datetime, options
11
- end
12
-
13
- def remove_timestamps(table_name, options = {})
14
- remove_column table_name, :updated_at
15
- remove_column table_name, :created_at
16
- remove_column table_name, :cached_at
17
- end
18
- end
19
-
20
- end
21
- end