Rails: идентификатор класса / object_id изменяется во время одного и того же запроса - PullRequest
2 голосов
/ 26 октября 2010

У меня возникла проблема при попытке сравнить две модели Rails. Они должны оцениваться как одинаковые, но то, как ActiveRecord реализует ==, приводит к сбою. Что еще более странно, так это прохождение модульных тестов.

Предположим, у пользователя много сообщений, а в сообщениях много комментариев. Пользователь также имеет множество комментариев.

(и это сравнивает два объекта, которые должны быть одинаковыми)

User.first.comments.first == Post.forst.comments.first

Когда я записываю object_ids в Rails.logger, они не равны. После просмотра исходного кода я обнаружил, что это условие приводит к сбою.

http://github.com/rails/rails/blob/30dcac292606da0e031d1e0dfbb6fc6109e5da60/activerecord/lib/active_record/base.rb#L1602

Я ожидаю:

User.first.comments.class.object_id == Post.first.comments.class.object_id

Но это не тот случай.

Модель включает в себя модуль, который выполняет следующие действия внутри себя. Включено (база)

base.send :include, InstanceMethods
base.send :extend,  ClassMethods

Когда я беру включение из моделей, все работает нормально.

Есть ли что-то с шаблоном включения / расширения, которое вызывает перезагрузку моделей или их неправильное кэширование в рамках одного и того же запроса?

Любые идеи здесь были бы великолепны !!!

1 Ответ

0 голосов
/ 26 октября 2010

object_id - это идентификатор ruby ​​для экземпляра, а не идентификатор строки в вашей базе данных.Переопределение ActiveRecord == сравнивает id, а не object_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...