我有一系列哈希 - @profiles,其数据为:
[{:user_id=>5, :full_name=>"Emily Spot"},{:user_id=>7, :full_name=>"Kevin Walls"}]
我想得到full_name,比如说user_id = 7?我正在执行以下操作:但是它会抛出表达式@profiles.find{|h| h[':user_id'] == current_user.id}
为零的错误。
name = @profiles.find{ |h| h[':user_id'] == current_user.id }[':full_name']
如果我使用select
而不是find
,则错误是 - 没有将String隐式转换为整数。
如何搜索哈希数组?
更新
在@ Eric的回答之后,我重新构建了我的工作模式&查看行动:
def full_names
profile_arr||= []
profile_arr = self.applications.pluck(:user_id)
@profiles = Profile.where(:user_id => profile_arr).select([:user_id, :first_name, :last_name]).map {|e| {user_id: e.user_id, full_name: e.full_name} }
@full_names = @profiles.each_with_object({}) do |profile, names|
names[profile[:user_id]] = profile[:full_name]
end
end
在视图....,
p @current_job.full_names[current_user.id]
答案 0 :(得分:5)
@profiles
是一个散列数组,符号为键,而你使用的是String
个对象。
因此':user_id'
是一个字符串,您需要符号::user_id
:
@profiles.find{ |h| h[:user_id] == current_user.id }
我想
full_name
说user_id == 7
@profiles.find { |hash| hash[:user_id] == 7 }.fetch(:full_name, nil)
注意,我使用Hash#fetch
作为案例,当密钥7
没有值为:user_id
的哈希时。
答案 1 :(得分:3)
正如您所注意到的,提取user_id
7的名称并不是很方便。您可以稍微修改一下数据结构:
@profiles = [{:user_id=>5, :full_name=>"Emily Spot"},
{:user_id=>7, :full_name=>"Kevin Walls"}]
@full_names = @profiles.each_with_object({}) do |profile, names|
names[profile[:user_id]] = profile[:full_name]
end
p @full_names
# {5=>"Emily Spot", 7=>"Kevin Walls"}
p @full_names[7]
# "Kevin Walls"
p @full_names[6]
# nil
您没有丢失任何信息,但名称查找现在更快,更容易,更健壮。
答案 2 :(得分:1)
建议,创建一个可以简化事情的新哈希
<强>例如强>
results = {}
profiles = [
{user_id: 5, full_name: "Emily Spot"},
{user_id: 7, full_name: "Kevin Walls"}
]
profiles.each do |details|
results[details[:user_id]] = details[:full_name]
end
现在,结果将有:
{5: "Emily Spot", 7: "Kevin Walls"}
因此,如果您需要获取full_name,例如user_id = 7,只需执行:
results[7] # will give "Kevin Walls"