0

我正在尝试使用哈希来存储用户。我有这段代码,它正在工作,但这不是我想要的方式:

@user_hash = Hash.new
@user_hash = User.all(:all)

user = Hash.new
user = @user_hash.select { |item| item["user_id"] == '001' }

puts user[0].name

我怎样才能使用类似user.nameinsted的东西user[0].name

4

3 回答 3

5

首先,你不需要在使用之前初始化你的哈希——这两个调用在Hash.new这里都是不必要的。

其次,您唯一的问题是您正在使用该select方法。引用文档

返回一个新的哈希,该哈希由块返回 true 的条目组成。

那不是你想要的。您想使用detect:传递枚举中的每个条目以阻止。返回第一个不为假的块。

user = @user_hash.detect { |item| item["user_id"] == '001' }应该管用

于 2012-08-16T17:33:57.487 回答
1

要创建哈希,您应该使用以下语法:

@user_hash = Hash[User.find(:all).collect{|u| [u.user_id, u]}]

然后您可以执行以下操作:

puts user["001"].name

于 2012-08-16T17:31:06.740 回答
0

user = Hash.new是浪费时间,因为您正在用以下结果覆盖它select

select返回一个通过测试的哈希数组。

您想要.find或其同义词.detect而不是.select.

于 2012-08-16T17:36:05.583 回答