class ActiveModelCachers::ColumnValueCache
Public Class Methods
new()
click to toggle source
# File lib/active_model_cachers/column_value_cache.rb, line 4 def initialize @cache1 = Hash.new{|h, k| h[k] = {} } @cache2 = Hash.new{|h, k| h[k] = {} } end
Public Instance Methods
add(object, class_name, id, foreign_key, model)
click to toggle source
# File lib/active_model_cachers/column_value_cache.rb, line 9 def add(object, class_name, id, foreign_key, model) value = (@cache1[class_name][[id, foreign_key]] ||= get_id_from(object, id, foreign_key, model)) return ->{ (value == :not_set ? query_value(object, class_name, id, foreign_key) : value)} end
clean_cache()
click to toggle source
# File lib/active_model_cachers/column_value_cache.rb, line 30 def clean_cache @cache1.clear @cache2.clear end
query_value(object, class_name, id, foreign_key)
click to toggle source
# File lib/active_model_cachers/column_value_cache.rb, line 14 def query_value(object, class_name, id, foreign_key) cache = @cache2[class_name] if cache.empty? no_data_keys = @cache1[class_name].select{|k, v| v == :not_set }.keys ids = no_data_keys.map(&:first).uniq columns = ['id', *no_data_keys.map(&:second)].uniq pluck_columns(object, object.where(id: ids).limit(ids.size), columns).each do |columns_data| model_id = columns_data.first columns.each_with_index do |column, index| cache[[model_id, column]] = columns_data[index] end end end return cache[[id, foreign_key]] end
Private Instance Methods
get_id_from(object, id, column, model)
click to toggle source
# File lib/active_model_cachers/column_value_cache.rb, line 41 def get_id_from(object, id, column, model) return id if column == 'id' model ||= object.cacher.peek_by(id: id) if object.has_cacher? return model.send(column) if model and model.has_attribute?(column) return :not_set end
pluck_columns(_, relation, columns)
click to toggle source
# File lib/active_model_cachers/column_value_cache.rb, line 37 def pluck_columns(_, relation, columns) relation.pluck(*columns) end