Основная проблема заключается в том, что require не является потокобезопасным действием в ruby.Одним из аспектов этого является то, что определение класса не происходит атомарно.
Обратите внимание на следующее в файле foo.rb
class Foo
BAR=1
def bar
end
end
Поток 1 указывает Foo::BAR
где-нибудь в вашем приложении и начинает загрузку foo.rb.Доходит до class Foo
, создавая класс Foo, но не дальше.Затем поток 1 прерывается, а поток 2 также обращается к Foo::BAR
.Foo уже определен, поэтому foo.rb не загружается снова, однако BAR еще не определен (это будет, когда поток 1 завершит свою работу), и вы получите сообщение об отсутствии const.Точно так же объект Foo
, созданный в этой точке, не будет иметь метода bar
в течение короткой доли секунды.
Очевидно, что чем больше класс, тем больше это окно(чтобы было легче увидеть, вы можете вставить вызов в режим ожидания частично через определение класса)
Чтобы обойти это, rails загружает весь код вашего приложения при запуске приложения, но если у вас есть код в нестандартные места это не получит это лечение.Вы можете контролировать то, что загружается таким образом, с помощью параметра config.eager_load_paths
.