Rails:index_by返回nil键

时间:2016-09-26 21:04:47

标签: ruby-on-rails ruby activerecord

我看到index_by有些奇怪的行为(或许是有意的,我只是不理解)。

pry(#<#<Class:0x18c40dc1>>)> permissions[:all]
=> [#<Permission:0x557be464 id: 118, role_id: 2, ne_attribute_id: nil, workflow_id: 1, profile_type_id: nil, value: "x">,
#<Permission:0x1078d014 id: 120, role_id: 2, ne_attribute_id: nil, workflow_id: 2, profile_type_id: nil, value: "x">,
#<Permission:0x38a840bb id: 122, role_id: 2, ne_attribute_id: nil, workflow_id: 3, profile_type_id: nil, value: "x">,
#<Permission:0x1c8b4fc9 id: 124, role_id: 2, ne_attribute_id: nil, workflow_id: 4, profile_type_id: nil, value: "x">,
#<Permission:0x43e0e354 id: 126, role_id: 2, ne_attribute_id: nil, workflow_id: 5, profile_type_id: nil, value: "x">,
#<Permission:0x07381c77 id: 128, role_id: 2, ne_attribute_id: nil, workflow_id: 6, profile_type_id: nil, value: "x">,
#<Permission:0x418bfe5e id: 130, role_id: 2, ne_attribute_id: nil, workflow_id: 7, profile_type_id: nil, value: "x">,
#<Permission:0x05355f78 id: 191, role_id: 2, ne_attribute_id: 29, workflow_id: nil, profile_type_id: nil, value: "w">,
#<Permission:0x66d3687d id: 198, role_id: 2, ne_attribute_id: 60, workflow_id: nil, profile_type_id: nil, value: "r">,
#<Permission:0x214f0b74 id: 207, role_id: 2, ne_attribute_id: 61, workflow_id: nil, profile_type_id: nil, value: "r">,
#<Permission:0x3fa8680d id: 220, role_id: 2, ne_attribute_id: nil, workflow_id: nil, profile_type_id: 1, value: "e">,
#<Permission:0x10493e1f id: 221, role_id: 2, ne_attribute_id: nil, workflow_id: nil, profile_type_id: 2, value: "c">]

pry(#<#<Class:0x18c40dc1>>)> permissions[:all].class
=> Permission::ActiveRecord_AssociationRelation

当我致电permissions[:all].index_by(&:profile_type_id)时,我会收到一个nil profile_type_id的对象。

pry(#<#<Class:0x18c40dc1>>)> permissions[:all].index_by(&:profile_type_id)
=> {nil=>#<Permission:0x214f0b74 id: 207, role_id: 2, ne_attribute_id: 61, workflow_id: nil, profile_type_id: nil, value: "r">,
 1=>#<Permission:0x3fa8680d id: 220, role_id: 2, ne_attribute_id: nil, workflow_id: nil, profile_type_id: 1, value: "e">,
 2=>#<Permission:0x10493e1f id: 221, role_id: 2, ne_attribute_id: nil, workflow_id: nil, profile_type_id: 2, value: "c">}

问题:

为什么我收到没有permission的第一个profile_type_id对象?另外,如果它返回的值为nil profile_type_id,为什么不返回nil profile_type_id的其他对象?

此外,在测试中,我发现inject做了同样的事情。

pry(#<#<Class:0x18c40dc1>>)> permissions[:all].inject({}){|hash, val| hash.merge(val.profile_type_id => val)}
=> {nil=>#<Permission:0x214f0b74 id: 207, role_id: 2, ne_attribute_id: 61, workflow_id: nil, profile_type_id: nil, value: "r">,
 1=>#<Permission:0x3fa8680d id: 220, role_id: 2, ne_attribute_id: nil, workflow_id: nil, profile_type_id: 1, value: "e">,
 2=>#<Permission:0x10493e1f id: 221, role_id: 2, ne_attribute_id: nil, workflow_id: nil, profile_type_id: 2, value: "c">}

1 个答案:

答案 0 :(得分:0)

因为索引通常是唯一的。您正在通过profile_type_id编制索引,该文件具有3个唯一值:1,2,无。

在所有具有profile_type_id = nil的记录中,只返回最后一个记录。