在 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被用作哈希值。
默认的 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被用作哈希值。