123456789_123456789_123456789_123456789_123456789_

Module: ActiveRecord::Integration

Relationships & Source Files
Namespace Children
Modules:
Extension / Inclusion / Inheritance Descendants
Included In:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Defined in: activerecord/lib/active_record/integration.rb

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

Instance Method Summary

  • #cache_key

    Returns a stable cache key that can be used to identify this record.

  • #cache_key_with_version

    Returns a cache key along with the version.

  • #cache_version

    Returns a cache version that can be used together with the cache key to form a recyclable caching scheme.

  • #to_param

    Returns a ::String, which Action Pack uses for constructing a URL to this object.

DSL Calls

included

[ GitHub ]


9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'activerecord/lib/active_record/integration.rb', line 9

included do
  ##
  # :singleton-method:
  # Indicates the format used to generate the timestamp in the cache key, if
  # versioning is off. Accepts any of the symbols in Time::DATE_FORMATS.
  #
  # This is :usec, by default.
  class_attribute :cache_timestamp_format, instance_writer: false, default: :usec

  ##
  # :singleton-method:
  # Indicates whether to use a stable #cache_key method that is accompanied
  # by a changing version in the #cache_version method.
  #
  # This is true, by default on \Rails 5.2 and above.
  class_attribute :cache_versioning, instance_writer: false, default: false

  ##
  # :singleton-method:
  # Indicates whether to use a stable #cache_key method that is accompanied
  # by a changing version in the #cache_version method on collections.
  #
  # This is false, by default until \Rails 6.1.
  class_attribute :collection_cache_versioning, instance_writer: false, default: false
end

Instance Method Details

#cache_key

Returns a stable cache key that can be used to identify this record.

Product.new.cache_key     # => "products/new"
Product.find(5).cache_key # => "products/5"

If Base.cache_versioning is turned off, as it was in Rails 5.1 and earlier, the cache key will also include a version.

Product.cache_versioning = false
Product.find(5).cache_key  # => "products/5-20071224150000" (updated_at available)
[ GitHub ]

  
# File 'activerecord/lib/active_record/integration.rb', line 72

def cache_key
  if new_record?
    "#{model_name.cache_key}/new"
  else
    if cache_version
      "#{model_name.cache_key}/#{id}"
    else
      timestamp = max_updated_column_timestamp

      if timestamp
        timestamp = timestamp.utc.to_fs(cache_timestamp_format)
        "#{model_name.cache_key}/#{id}-#{timestamp}"
      else
        "#{model_name.cache_key}/#{id}"
      end
    end
  end
end

#cache_key_with_version

Returns a cache key along with the version.

[ GitHub ]

  
# File 'activerecord/lib/active_record/integration.rb', line 114

def cache_key_with_version
  if version = cache_version
    "#{cache_key}-#{version}"
  else
    cache_key
  end
end

#cache_version

Returns a cache version that can be used together with the cache key to form a recyclable caching scheme. By default, the #updated_at column is used for the cache_version, but this method can be overwritten to return something else.

Note, this method will return nil if Base.cache_versioning is set to false.

[ GitHub ]

  
# File 'activerecord/lib/active_record/integration.rb', line 97

def cache_version
  return unless cache_versioning

  if has_attribute?("updated_at")
    timestamp = updated_at_before_type_cast
    if can_use_fast_cache_version?(timestamp)
      raw_timestamp_to_cache_version(timestamp)

    elsif timestamp = updated_at
      timestamp.utc.to_fs(cache_timestamp_format)
    end
  elsif self.class.has_attribute?("updated_at")
    raise ActiveModel::MissingAttributeError, "missing attribute 'updated_at' for #{self.class}"
  end
end

#to_param

Returns a ::String, which Action Pack uses for constructing a URL to this object. The default implementation returns this record’s id as a ::String, or nil if this record’s unsaved.

For example, suppose that you have a User model, and that you have a resources :users route. Normally, user_path will construct a path with the user object’s ‘id’ in it:

user = User.find_by(name: 'Phusion')
user_path(user)  # => "/users/1"

You can override to_param in your model to make user_path construct a path using the user’s name instead of the user’s id:

class User < ActiveRecord::Base
  def to_param  # overridden
    name
  end
end

user = User.find_by(name: 'Phusion')
user_path(user)  # => "/users/Phusion"
[ GitHub ]

  
# File 'activerecord/lib/active_record/integration.rb', line 57

def to_param
  return unless id
  Array(id).join(self.class.param_delimiter)
end