Я использую гем request_store, он отлично работает.
Мой вариант использования - добавление методов к классу модели пользователя, таких как current_user, их языковой стандарт, местоположение и т. Д., Поскольку часто другие мои модели нуждаются в этой информации.
Я просто настраиваю текущего пользователя из своего контроллера приложения:
User.current = the_authenticated_user
User.request = request
И в моем классе модели пользователя:
class User
def self.current
RequestStore.store[:current_user]
end
def self.current=(user)
RequestStore.store[:current_user] = user
end
def self.request
RequestStore.store[:current_request]
end
def self.request=(request)
# stash the request so things like IP address and GEO-IP based location is available to other models
RequestStore.store[:current_request] = request
end
def self.location
# resolve the location just once per request
RequestStore.store[:current_location] ||= self.request.try(:location)
end
end
Я не включаю опцию перезагрузки классов, так как она вызывает слишком много проблем, я видел несколько версий классов. Если вы используете наследование модели (например, STI), отложенная загрузка и / или загрузка динамического класса часто нарушает способ разрешения классов модели. Вам необходимо использовать require_dependency в базовых и промежуточных классах модели, чтобы гарантировать загрузку последующих классов.
Мои настройки разработки отражают мои производственные настройки с обработкой классов, что неудобно (требует перезапуска сервера после изменения), но более удобно, чем преследование несуществующих ошибок. Гем rerun может отслеживать изменения файловой системы и перезапускать сервер за вас, чтобы вы могли надежно обрабатывать изменения в развитие, хотя и медленнее, чем рельсы с перезарядкой сломанного класса.
config / environment / development.rb:
# Rails class reloading is broken, anytime a class references another you get multiple
# class instances for the same named class and that breaks everything. This is especially
# important in Sequel as models resolve classes once.
# So always cache classes (true)
config.cache_classes = true
# Always eager load so that all model classes are known and STI works
config.eager_load = true
В: Каким образом потокобезопасные переменные классов?
О: Никакие переменные не являются потокобезопасными, если они не защищены synchronize
.
С архитектурной точки зрения многопоточность в Rails - пустая трата времени. Единственный способ добиться истинной параллельной производительности / параллелизма - это несколько процессов. Это также позволяет избежать накладных расходов, связанных с блокировкой и потоковой передачей, которых просто нет при длительных процессах. Я тестировал код, интенсивно использующий параллельный ЦП, используя потоки с Ruby 2.x, и не обнаружил никакого параллелизма. С 1 рубиновым процессом на ядро я получил настоящий параллелизм.
Я бы серьезно рассмотрел Thin с несколькими процессами, а затем решил, хотите ли вы использовать Thin + EventMachine для увеличения общей пропускной способности каждого процесса.
person
Andrew Hacking
schedule
02.01.2015