12 октября 2009

Cache money warm-up

С недавнего времени использую в своём проекте Cache money. Вещь хорошая, но, конечно же, есть и недостатки, впрочем, это предмет для форка и багфиксов. Стоит также отметить, что решение может уже и существует среди форков, коих много.
Если у вас всё в порядке с памятью (RAM, I mean), то может возникнуть желание принудительно заполнить кеш по всем индексам всех моделей. Сниппет извлечён из моего Rakefile'а и адаптирован для использования в рельсах. Предупреждение: не тестировалось именно в рельсах и против составных индексов (хотя и предусматривает их использование).

namespace :rails do
desc "Fills Cache money's caches for all indexes of all models - rails version"
task :warmup_cache => :env do
logger = Logger.new(STDOUT)
ActiveRecord::Base.logger = logger
Dir.glob(RAILS_ROOT + '/app/models/*.rb').each { |file| require file }
models = Object.subclasses_of(ActiveRecord::Base)
models.each do |klass|
table_name = klass.name.to_s.tableize
klass.cache_config.indices.each do |index|
logger.info "Warming #{klass.name} for #{index.attributes} index"
values = ActiveRecord::Base.connection.select_values("select #{index.attributes * ', '} from `#{table_name}`")
values.reject!{|val| val.kind_of?(Array) ? val.any?{|subval| subval.nil?} : val.nil? }
values.each {|val| klass.send(:"find_by_#{index.attributes * '_and_'}", *val)}
end
end
end
end
view raw Rakefile.rb hosted with ❤ by GitHub

Комментариев нет: