在 ActiveRecord 上覆盖 .hash 是否安全?

Is it safe to override .hash on an ActiveRecord?

默认的 ActiveRecord hash 实现是 return id 的散列。

这非常适合持久化实例。对于非持久化实例 非常糟糕 尤其是 因为对于没有 ID 的 ActiveRecord 实例 Rails 默认为 BasicObject.==

因此所有未保存的 ActiveRecord 实例都将具有相同的哈希值而不是相等的。这是将许多未持久化的 ActiveRecord 实例放入 Set 的最坏情况。

我对我的用户 class 进行了以下操作。 是否有一些 "Rails reason" 我不应该这样做?是否有关于此的文档或讨论? 我的所有测试仍然通过。

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

此问题已在 rails 4.2 中修复。

具体来说,如果一个activerecord实例有一个空id,那么object_id.hash被用作哈希值。