2015-04-29 6 views
1

Реализация по умолчанию ActiveRecord hash - это вернуть хэш идентификатора.Можно ли переопределить .hash на ActiveRecord?

Это замечательно для сохранившихся случаев. Это ужасно для неустановленных экземпляров особенно, потому что Rails по умолчанию имеет значение BasicObject.== для экземпляров ActiveRecord без идентификаторов.

Таким образом, все несохраненные экземпляры ActiveRecord будут иметь одинаковый хеш и не будут равны. Это самый худший сценарий для работы с множеством экземпляров ActiveRecord, которые сохраняются в Set.

В моем классе User я сделал следующее. Есть ли какая-то «причина Rails», я не должен этого делать? Есть ли документация или дискуссия об этом? Все мои тесты все еще проходят.

alias_method :_old_hash, :hash 
def hash 
    id ? _old_hash : email.hash + api_key.hash 
end 

ответ

0

Эта проблема исправлена ​​в рельсах 4.2.

В частности, если экземпляр activerecord имеет нулевой идентификатор, то object_id.hash используется как хэш-значение.

+0

Можете ли вы уточнить? Как это было исправлено? – messanjah

+0

Я добавил важную недостающую деталь. – z5h