У нас есть относительно стандартный проект Ruby on Rails, в котором довольно много фоновых заданий, выполняемых под Resque (с Redis в качестве бэкэнда).
Проблема в том, что очень редко - возможно, раз в месяц, а может, и реже - мы внезапно увидим поток исключений из Resque. Исключения следующие:
undefined method `find_by_id` for User():Class
undefined method `find_by_name` for CustomerAccount():Class
undefined method `find_by_id` for Job():Class
Кажется, что внезапно все модели ActiveRecord :: Base теряют свои find_by_*
методы для всего потока. Перезапуск рабочего решает проблему.
Я знаю, что в общем случае ответ должен быть таким: «кто-то где-то - возможно, в драгоценном камне - каким-то образом нарушает method_missing». Или, возможно, каким-то образом константы переназначаются другому классу. Но прежде чем я начну действительно тщательное расследование, я хотел проверить, не сталкивался ли кто-нибудь с этой проблемой и не решил ли ее.
Этот проект работает под управлением Ruby 2.1.1p76, Rails 3.2.17, Resque 1.25.1.
where(...).first
? Они все равно уйдут, так что вам рано или поздно придется их заменить. Вы также можете пропатчитьfind_by(x)
(какwhere(x).first
) в ActiveRecord и использовать его вместо этого,find_by
входит в состав Rails4, поэтому ваш код будет совместим с будущим, вам просто нужно не забыть убить свой обезьяний патч при обновлении. - person mu is too short   schedule 31.10.2014find_by_xxx
. См. здесь. Они обесценили многие из динамических поисковых систем, но их нет в списке. Хотя, похоже, это заблуждение, распространившееся на многих разработчиков. - person engineersmnky   schedule 31.10.2014find_by_*
методы реализованы через _2 _ / _ 3_.respond_to?
проверяет, существует ли столбец с определенным именем. Я предполагаю, что если ваше соединение с базой данных в какой-то момент по какой-то причине не удается, вы начинаете получать эти ошибки, поскольку набор столбцов, известный вашему приложению, пуст. Можете ли вы проверить свои журналы на наличие следов сбойных / закрытых соединений в воркерах? - person moonfly   schedule 04.11.2014