我正在使用Ruby on Rails 3.0.7,我想了解如何处理以下代码以检索具有指定id
的类对象。
在我的视图文件中,我有:
@records = Users.all # This returns an array (class)
在另一个文件中,部分模板,我想检索一下id
1的用户,但如果我这样做:
@records.find(1)
我得到了所有记录的enumerator
(类):
<Enumerator: [<Users id: 1, ... ] >
如何找到id
1(或其他ids)“làRubyon Rails Way”的用户?
更新
我在视图文件中使用@records = Users.all
,因为我的目标是最小化对数据库的调用,因为我需要迭代几乎所有记录并检查它们是否存在。如果我这样做:
some_hash.each { |key, value|
put User.find(value)
}
我进入日志文件,我会看到很多数据库请求。
答案 0 :(得分:4)
虽然这可能很慢,但我怀疑你正在开发的应用程序中有一些不是最优的设计(不是评判,我们都在那里),Array#index似乎是什么你在寻找:
@records[@records.index{|user| user.id == 1}]
修改强>
虽然如果你需要为每个用户做一些事情,并且你需要快速通过id访问它们,我可能会在你的控制器中做这样的事情。即使它不是真的更快,它也更具可读性(对我而言):
@users_hash = {}
User.all.each{|user| @users_hash[user.id] = user}
然后在你的观点中你可以做到:
@users_hash[id].username
答案 1 :(得分:1)
使用User.scoped
代替User.all
。 #all
将立即查询数据库并返回一个数组,而#scoped
将返回一个ActiveRecord::Relation
对象,您可以链接进一步的查询。在这种情况下,在您尝试以某种方式检查或枚举结果之前,不会命中数据库
答案 2 :(得分:0)
其实你错了。 @records.find(1)
返回Enumerator类的对象(与Enumerator类本身不同)。
这里的问题是,正如您所指出的那样,@records
是一个数组,而不是一个ActiveRecord对象,而Array#find
(inherited from Enumerable#find
- 当没有给出一个块时,返回类的对象Enumerable)与ActiveRecord::Base#find
的方法不同(即User#find
)。
您应该在控制器中选择您想要的一个用户记录:
@user = User.find 1
...然后直接在模板中使用@user
。通常,您应该避免在模板中执行ActiveRecord查找(例如find
)。这种逻辑应该在你的控制器中发生。
答案 3 :(得分:0)
上次这样的情况我最终这样做了:
@assignments = Assignment.find_by_sql(' ... ')
@assignments.find(id: 1).first