С недавнего времени использую в своём проекте Cache money. Вещь хорошая, но, конечно же, есть и недостатки, впрочем, это предмет для форка и багфиксов. Стоит также отметить, что решение может уже и существует среди форков, коих много.
Если у вас всё в порядке с памятью (RAM, I mean), то может возникнуть желание принудительно заполнить кеш по всем индексам всех моделей. Сниппет извлечён из моего Rakefile'а и адаптирован для использования в рельсах. Предупреждение: не тестировалось именно в рельсах и против составных индексов (хотя и предусматривает их использование).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Комментариев нет:
Отправить комментарий