我看到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">}
答案 0 :(得分:0)
因为索引通常是唯一的。您正在通过profile_type_id编制索引,该文件具有3个唯一值:1,2,无。
在所有具有profile_type_id = nil的记录中,只返回最后一个记录。