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

时间:2015-04-29 21:27:28

标签: ruby-on-rails rails-activerecord

默认的ActiveRecord hash实现是返回id的哈希值。

这对于持久化实例非常有用。对于非持久化实例特别是可怕,因为对于没有ID的ActiveRecord实例,Rails默认为BasicObject.==

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

我在User类上做了以下操作。 是否有一些“Rails原因”我不应该这样做?有没有关于此的文档或讨论?我的所有测试仍然通过。

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

1 个答案:

答案 0 :(得分:0)

此问题已在rails 4.2中修复。

具体来说,如果activerecord实例具有null id,则object_id.hash用作哈希值。