2009-02-26 2 views
1

У меня очень странная проблема. Я получаю коллекцию моделей Rails ActiveRecord из базы данных, но первая модель в коллекции не имеет атрибутов/методов модели, а также стандартных базовых методов ActiveRecord. Остальные имеют все атрибуты. И это делается только на моем сервере debian с использованием Passenger. Он работает на OS X и cygwin.Модель первого Activerecord отсутствует атрибуты/методы

Любые идеи?

Спасибо, Кевин

ответ

0

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

+0

Добро пожаловать. :) – vladr

0

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

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

+0

@Luke, плохие данные в БД не должны и не влияют на методы доступа к атрибутам отдельных объектов. Они свариваются с классом и влияют на модели по принципу «все или ничего». – vladr

+0

Хорошая точка. Я думал, что, возможно, атрибуты возвращались ноль, но если их просто нет ... Это совсем другая история. –

+0

@ Luke, на самом деле я беру это обратно для Rails 2.2 ... глядя на исходный код 2.2, он, по-видимому, проверяет не столбцы, а столбцы, которые на самом деле были найдены (простить мой французский) из db. – vladr

0

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

0

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

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

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

+0

Хорошо, что имеет смысл, что первая запись еще не имеет методов/атрибутов, пока она не будет вызвана. Я использую агрегатный класс, который имеет коллекцию моделей activerecord и вызывает метод и суммирует результаты. См. Ниже в следующем комментарии –

+0

def method_missing (метод, * args, & block) @ records.inject (0) {| sum, record | sum + (eval ("record. # {method.to_s}") || 0)} end Странно, что я получаю исключение method_missing, когда я вызываю метод атрибута для двух моих атрибутов , остальные работают просто отлично. –

+0

Проверка работоспособности: можете ли вы вставить там регистратор, чтобы проверить тип записи и действительно ли в записи есть соответствующий столбец? – vladr

Смежные вопросы