Шаблон, который вы ищете, известен как одноэлементный, который представляет собой простой способ кэширования данных, которые не меняются со временем, например, вы часто будете видеть что-то подобное в application_controller.rb - вашем кодевсегда вызывает метод
def current_user(user_id)
@current_user ||= User.find user_id
end
Когда он это делает, он проверяет переменную экземпляра @current_user и возвращает ее, если не nil, в противном случае он выполняет поиск в базе данных и присваивает результат переменной экземпляра, которую он возвращает.
Ваша проблема похожа, но шире, поскольку она применима ко всем экземплярам.
Одно решение - с помощью переменной класса, которая описана здесь http://www.ruby -doc.org /docs / ProgrammingRuby / html / tut_classes.html # S3 - здесь применимо решение, подобное приведенному выше.
Это может быть хорошим решением в вашем случае, но имеет некоторые проблемы.В частности (в предположении, что это веб-приложение), в зависимости от вашей конфигурации, у вас может быть несколько экземпляров Rails, загруженных в разные процессы, и переменные класса применяются только к их конкретному экземпляру.Популярный модуль Passenger (для Apache и Nginx) можно настроить так, чтобы переменные класса были доступны для всех его экземпляров ... что прекрасно работает, если у вас только один сервер.
Но когда у вас несколько сервероввсе становится немного сложнее.Конечно, вы можете использовать переменную класса и согласиться с тем, что вам придется сделать одно попадание в базу данных для каждого сервера.Это прекрасно работает, за исключением случаев, когда переменная ... меняется!Вам понадобится какой-то способ аннулирования переменной на всех серверах.В зависимости от того, насколько это критично, это может создать очень грубые и трудные для отслеживания ошибки (я научился трудному пути: -).
Введите memcached.Это замечательный инструмент, который является инструментом кэширования общего назначения.Это очень легкий и очень, очень умный.В частности, он может создавать распределенные кэши по кластеру серверов - значение сохраняется только один раз (таким образом, избегая проблемы синхронизации, отмеченной выше), и каждый сервер знает, какой сервер искать, чтобы найти любой данный ключ кэша.Он даже справляется, когда серверы выключаются, и всякого рода другие неприятности.
Установка чрезвычайно проста, и Rails почти предполагает, что вы будете использовать ее для своих различных потребностей в кэшировании, а гем Rails просто делает это так же просто, какpie.
Если предположить, что будут другие возможности для кэширования содержимого, которое может быть не таким простым, как значение, которое вы можете сохранить в переменной класса, это, вероятно, первое место для начала.