Activerecord объект равенство
-
25-10-2019 - |
Вопрос
По словам документов Activerecord :: Base:
== (comparrishon_object) возвращает true, если comparrison_object - это тот же самый объект, или comparison_object имеет один и тот же тип, и Self имеет идентификатор, и он равен comparrison_object.id.
Обратите внимание, что новые записи отличаются от любой другой записи по определению, если только другая запись не является самим приемником. Кроме того, если вы получите существующие записи с Select и оставите идентификатор, вы сами, этот предикат вернется false.
Также обратите внимание, что уничтожение записи сохраняет свой идентификатор в экземпляре модели, поэтому удаленные модели все еще сопоставимы.
Но мои наблюдения показывают, что он сравнивает только промежутки, а не идентификаторы, так что следующее - правда:
a = Factory.create(:user)
b = User.find_by_email(a.email) # b is logically same as a
a.id.should == b.id # All good
a.should == b # FAILS: Contradicts the docs
a.should_not == b # Contradicts the docs
a.should_not eql b # Contradicts the docs
Вопрос в том, что 2 экземпляра считаются разными, в то время как документы явно говорят, что они должны быть равными?
ОБНОВИТЬ: Равенство Работает, как и ожидалось. Пример кода не имеет значения. Анкет Смотрите мой ответ ниже.
Решение
Отвечая на мой собственный вопрос (что не имеет значения).
Все проверки равенства работают, как и ожидалось (и описано в документах).
Я предполагаю, что причина, по которой это не сработало для меня, заключается в том, что я бегу autotest
И что -то может быть кэшировано или по какой -то другой мифической причине, которую я не могу объяснить прямо сейчас.
Подводя итог, все следующие утверждения действительно проходят:
a = Factory.create(:user)
b = User.find_by_email(a.email) # b is logically same as a
a.id.should == b.id
a.should == b
a.should eql b
User.find_by_email(a.email).should == User.find_by_email(a.email)
a.should == User.find_by_email(a.email)
b.should == User.find_by_email(a.email)
Другие советы
Посмотрите ближе на определение: Обратите внимание, что новые записи отличаются от любой другой записи по определению.
В этом случае, поскольку AR обычно просто проверяет равенство в столбце Identity, вы можете сравнить два объекта, сравнивая результат того, что #Attributes возвращается для каждого.