Перегрузка классов Rails в производственном режиме - PullRequest
1 голос
/ 12 января 2010

Есть ли способ перезагрузить модель ruby ​​во время выполнения?

Например, у меня есть модель

class Model
  def self.all_models
    @@all_models ||= Model.all
  end    
end

Записи в этой модели меняются очень редко, но затем они меняются,Я не хочу перезагружать все приложение, только этот класс.

1 Ответ

0 голосов
/ 12 января 2010

На сервере разработки это не проблема. Производственный сервер большой.

На самом деле это невозможно без перезагрузки сервера. Лучшее, что вы можете сделать, - это добавить фильтр перед в ApplicationController для обновления переменных класса в каждом рабочем потоке, но это нужно делать при каждом запросе. Вы не можете легко отключить это поведение.

Если это ресурсоемкая операция, вы можете выбрать менее интенсивный тест, такой как сравнение значения в базе данных / времени последнего изменения файла с константой, определенной во время выполнения, чтобы определить, должна ли произойти полная перезагрузка. Но вам все равно придется делать это как часть каждого запроса.

Однако, насколько мне известно, изменить маршруты после загрузки сервера невозможно. Изменение других переменных сайта может потребовать немного больше усилий, таких как чтение из файла / базы данных и обновление до фильтра.

Возможно, есть и другой способ, но я его совсем не пробовал. Так что нет гарантии. Если вы используете сервер на основе ruby, например, mongrel. Теоретически вы можете использовать hijack для обновления модели / маршрутов / переменных в потоке управления, из которого создаются рабочие потоки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...