我有一个用户模型和地址模型。 当我做@ user = User.all 它返回
{ "id" : "1",
"firstname" : "test",
"username" : "test",
},
{ "id" : "2",
"firstname" : "test1",
"username" : "test2",
}
当我做@address =Address.all
{ "id" : "21",
"user_id" : "1",
"city" : "test",
"country" : "test",
},
{ "id" : "22",
"user_id" : "2",
"city" : "test1",
"country" : "test2",
}
我超越了价值
现在我想在单个Hash中合并@user和@ddress的值。 像前 -
{ "id" : "1",
"firstname" : "test",
"username" : "test",
"id" : "22",
"user_id" : "1",
"city" : "test1",
"country" : "test2",
},
{ "id" : "2",
"firstname" : "test2",
"username" : "test2",
"id" : "22",
"user_id" : "2",
"city" : "test1",
"country" : "test2",
}
怎么做?
答案 0 :(得分:1)
将一个数组索引为" id"哈希:
users_by_id = {}
@users.each {|h| users_by_id[h['id']] = h}
下一步,合并到第二个哈希:
@address.map do |address|
# search the user with the same id
u = users_by_id[address['user_id']]
if u
# rename 'id' key
u['uid'] = u['id']
address.merge(u)
else
address # no user matched!
end
end
答案 1 :(得分:1)
解决此问题的一种可能方法是在select子句中为复制列添加别名。对于您的地址模型,当您提取每条记录时,您可以执行以下操作:
@addresses = Address.select("id AS address_id, user_id, city, country").all
现在,地址模型哈希的ID列不应与用户哈希的ID列冲突。然后你可以使用:
将它们合并为Neil Slater建议的combo_hash = user_hash.merge(address_hash)