在类数组中查找类对象时出现问题

时间:2011-06-13 23:06:34

标签: ruby-on-rails ruby arrays ruby-on-rails-3 finder

我正在使用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)
}

我进入日志文件,我会看到很多数据库请求。

4 个答案:

答案 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#findinherited 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