module ActsAsTaggableOn::Taggable::Cache::Columns

Public Instance Methods

columns() click to toggle source

ActiveRecord::Base.columns makes a database connection and caches the

calculated columns hash for the record as @columns.  Since we don't
want to add caching methods until we confirm the presence of a
caching column, and we don't want to force opening a database
connection when the class is loaded, here we intercept and cache
the call to :columns as @acts_as_taggable_on_cache_columns
to mimic the underlying behavior.  While processing this first
call to columns, we do the caching column check and dynamically add
the class and instance methods
FIXME: this method cannot compile in rubinius
Calls superclass method
# File lib/acts_as_taggable_on/taggable/cache.rb, line 20
def columns
  @acts_as_taggable_on_cache_columns ||= begin
    db_columns = super
    _add_tags_caching_methods if _has_tags_cache_columns?(db_columns)
    db_columns
  end
end
reset_column_information() click to toggle source
Calls superclass method
# File lib/acts_as_taggable_on/taggable/cache.rb, line 28
def reset_column_information
  super
  @acts_as_taggable_on_cache_columns = nil
end

Private Instance Methods

_add_tags_caching_methods() click to toggle source

@private

# File lib/acts_as_taggable_on/taggable/cache.rb, line 44
def _add_tags_caching_methods
  send :include, ActsAsTaggableOn::Taggable::Cache::InstanceMethods
  extend ActsAsTaggableOn::Taggable::Cache::ClassMethods

  before_save :save_cached_tag_list

  initialize_tags_cache
end
_has_tags_cache_columns?(db_columns) click to toggle source

@private

# File lib/acts_as_taggable_on/taggable/cache.rb, line 36
def _has_tags_cache_columns?(db_columns)
  db_column_names = db_columns.map(&:name)
  tag_types.any? do |context|
    db_column_names.include?("cached_#{context.to_s.singularize}_list")
  end
end