В первой модели Activerecord отсутствуют атрибуты / методы - PullRequest
1 голос
/ 26 февраля 2009

У меня очень странная проблема. Я получаю коллекцию моделей Rails ActiveRecord из базы данных, но первая модель в коллекции не имеет атрибутов / методов модели, только стандартные базовые методы ActiveRecord. У остальных есть все атрибуты. И он делает это только на моем производственном сервере Debian, используя Passenger. Работает найти на OS X и Cygwin.

Есть идеи?

Спасибо, Kevin

Ответы [ 4 ]

0 голосов
/ 27 февраля 2009

Проблема заключалась в том, что я не использовал правильную версию freetds для SQL Server 2005. Я использовал старую версию протокола, которая не поддерживала имена столбцов длиной более 30 символов, поэтому не смог найти атрибут звонил. Это было усечено. Изменение в моем freetds.conf решило проблему. Спасибо Влад за помощь в устранении неполадок.

0 голосов
/ 26 февраля 2009

Трудно быть уверенным в этом, не выполняя некоторую отладку, но одна вещь, которую я мог бы рассмотреть, - это изучение потоков. Я считаю, что ActiveRecord определяет эти методы «на лету», когда они необходимы, и, возможно, вы обращаетесь к первой модели, пока она находится в процессе. Подобные проблемы могут возникнуть с оператором Ruby «require» - если вам требуется что-то в одном потоке, вполне возможно, что класс еще не будет полностью определен, когда вы попытаетесь получить к нему доступ в другом потоке.

0 голосов
/ 26 февраля 2009

Когда вы говорите, что первая модель в коллекции не имеет атрибутов / методов модели , это потому, что вы получаете исключение NoMethodError при попытке вызвать одну из них?

Обычно для модельного объекта не используются методы атрибута (например, при выводе вывода object.methods) до тех пор, пока вы не попытаетесь фактически вызвать их. При попытке вызвать один из отсутствующих рассматриваемых методов запускается обработчик method_missing ActiveRecord и, при условии, что имя метода совпадает с именем одного из столбцов, определенных в базе данных, метод будет создан динамически и никакое исключение не восстанет. Если этого не происходит, то это либо потому, что объект имеет неправильный класс (не соответствует модели, на которой вы ожидаете работать), либо потому, что плагин или драгоценный камень вмешиваются из-за неправильного поведения в цепочке обработки method_missing.

Можете ли вы вывести в журналы (logger.info или logger.info, в зависимости от уровня вашего журнала), какой self.class.name экземпляра объекта без атрибутов равен in? Можете ли вы также провести аудит драгоценных камней (и соответствующих версий), установленных на производстве, по сравнению с локальными?

0 голосов
/ 26 февраля 2009

Это может быть неверные данные в вашей производственной базе данных.

Я бы включил ваш уровень ведения журнала (производственная среда не регистрирует запросы SQL), нашел бы генерируемый запрос, а затем открыл бы производственную базу данных, запустил запрос и посмотрел, что он возвращает.

...