Вопрос

По словам документов 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 возвращается для каждого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top