aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/collection_cache_key.rb
diff options
context:
space:
mode:
authorAlberto F. Capel <afcapel@gmail.com>2015-07-14 23:47:16 +0100
committerAlberto F. Capel <afcapel@gmail.com>2015-07-20 01:46:03 +0100
commit476e3f552f59d208cb284f509760b44ad780c17a (patch)
tree900866eb6f02b5a5231f53db9dd5c37c03527852 /activerecord/lib/active_record/collection_cache_key.rb
parent6ffec3c16c0ee0b0ab4643907af1f2ed80a71a9a (diff)
downloadrails-476e3f552f59d208cb284f509760b44ad780c17a.tar.gz
rails-476e3f552f59d208cb284f509760b44ad780c17a.tar.bz2
rails-476e3f552f59d208cb284f509760b44ad780c17a.zip
Add #cache_key to ActiveRecord::Relation.
Diffstat (limited to 'activerecord/lib/active_record/collection_cache_key.rb')
-rw-r--r--activerecord/lib/active_record/collection_cache_key.rb29
1 files changed, 29 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/collection_cache_key.rb b/activerecord/lib/active_record/collection_cache_key.rb
new file mode 100644
index 0000000000..72b50c1d28
--- /dev/null
+++ b/activerecord/lib/active_record/collection_cache_key.rb
@@ -0,0 +1,29 @@
+module ActiveRecord
+ module CollectionCacheKey
+
+ def collection_cache_key(collection = all, timestamp_column = :updated_at) # :nodoc:
+ query_signature = Digest::MD5.hexdigest(collection.to_sql)
+ key = "#{collection.model_name.cache_key}/query-#{query_signature}"
+
+ if collection.loaded?
+ size = collection.size
+ timestamp = collection.max_by(&timestamp_column).public_send(timestamp_column)
+ else
+ column_type = type_for_attribute(timestamp_column.to_s)
+ column = "#{connection.quote_table_name(collection.table_name)}.#{connection.quote_column_name(timestamp_column)}"
+
+ query = collection.select("COUNT(*) AS size", "MAX(#{column}) AS timestamp")
+ result = connection.select_one(query)
+
+ size = result["size"]
+ timestamp = column_type.deserialize(result["timestamp"])
+ end
+
+ if timestamp
+ "#{key}-#{size}-#{timestamp.utc.to_s(cache_timestamp_format)}"
+ else
+ "#{key}-#{size}"
+ end
+ end
+ end
+end