Ruby on rails 在RoR中构建哈希:使用对象引用或ID作为键?

Ruby on rails 在RoR中构建哈希:使用对象引用或ID作为键?,ruby-on-rails,ruby,performance,memory,hash,Ruby On Rails,Ruby,Performance,Memory,Hash,我想知道在选择合适的密钥方面,构建自定义哈希的最佳方法是什么。可供选择的方案有: my_hash = {} for user in User.all do my_hash[user] = some_value # option 1 using object reference my_hash[user.id] = some_value # option 2 using object id end 我认为选项2应该是一种方式,因为它消耗更少的内存,并且可能更快。然而,它确实有一个缺

我想知道在选择合适的密钥方面,构建自定义哈希的最佳方法是什么。可供选择的方案有:

my_hash = {}
for user in User.all do
  my_hash[user] = some_value    # option 1 using object reference
  my_hash[user.id] = some_value # option 2 using object id
end
我认为选项2应该是一种方式,因为它消耗更少的内存,并且可能更快。然而,它确实有一个缺点:

选项1允许我将散列传递给视图,然后执行以下操作

<% @my_hash.collect do |user, value| %>
  <p><%= user.name %> | <%= value %></p>
<% end %>

|

然而,选项2需要某种方式从密钥中的id获取用户


任何关于如何处理这一问题的建议都将不胜感激如果您赞成选项2,请说明如何最好地访问散列键中id引用的对象。谢谢大家!

选项1不应是任何较慢的b/c对象引用在所需内存存储方面与整数实际上没有什么不同

您可以进行自己的测试,例如将100000或1000000个值分配给散列,一次分配给整数,另一次分配给对象


我敢肯定,根据您的操作系统、x86或x64以及ruby版本的不同,您会得到不同的结果。

选项1的速度不应该再慢了。b/c对象引用在所需内存存储方面与整数实际上没有什么不同

您可以进行自己的测试,例如将100000或1000000个值分配给散列,一次分配给整数,另一次分配给对象

我相信,根据您的操作系统、x86或x64以及ruby版本,您将获得不同的结果。

真正的问题是“您将如何使用此哈希”。如果您需要迭代并显示一些关于用户的信息,第一个选项更好;如果您需要访问与用户ID对应的值,则选项2更好。你甚至可以想出另一个解决办法

my_hash = {}

User.all.each do |u|
  my_hash[u.id] = [u, some_value]
end
我的观点是:没有正确的答案,这实际上取决于您将如何使用此哈希。

真正的问题是“您将如何使用此哈希”。如果您需要迭代并显示一些关于用户的信息,第一个选项更好;如果您需要访问与用户ID对应的值,则选项2更好。你甚至可以想出另一个解决办法

my_hash = {}

User.all.each do |u|
  my_hash[u.id] = [u, some_value]
end

我的观点是:没有正确的答案,这实际上取决于您将如何使用此哈希。

ActiveRecord将
ActiveRecord::Base\code>哈希定义为
id.hash
,因此使用
user
还是
user.id
作为哈希键绝对没有区别。话虽如此,选项1在您的特定情况下显然更好。

ActiveRecord将
ActiveRecord::Base#hash
定义为
id.hash
,因此使用
user
user.id
作为散列键绝对没有区别。已经说过,在您的特殊情况下,选项1显然更好。

谢谢您的回复!还没有做任何性能基准测试,所以我需要先熟悉它们。不过,我发现选项一有一个问题:当我想要获取一个特定条目时,例如@my_hash[User.first],那么1)我在内存中有两次该用户;2) ruby/rails将比较对象的主键,以在散列中找到正确的条目。那么,选项1仍然是推荐的解决方案吗?谢谢您的回复!还没有做任何性能基准测试,所以我需要先熟悉它们。不过,我发现选项一有一个问题:当我想要获取一个特定条目时,例如@my_hash[User.first],那么1)我在内存中有两次该用户;2) ruby/rails将比较对象的主键,以在散列中找到正确的条目。选项1仍然是推荐的解决方案吗?谢谢你指出第三个选项,@thoferon。事实上,我现在是在个案的基础上做这件事的,但我想重构我的代码以坚持两种选择之一。原因是我总是想知道密钥是ID还是obj。参考资料。我喜欢您的解决方案,因为它既可以处理散列中的所有数据,也可以非常轻松地检索单个条目。如果没有更好的解决方案,我会在一段时间后接受答案。谢谢你指出了第三个选项,@thoferon。事实上,我现在是在个案的基础上做这件事的,但我想重构我的代码以坚持两种选择之一。原因是我总是想知道密钥是ID还是obj。参考资料。我喜欢您的解决方案,因为它既可以处理散列中的所有数据,也可以非常轻松地检索单个条目。如果没有更好的解决方案,我会在一段时间后接受答案。谢谢