0

我正在使用 Ruby on Rails 3.0.7,我想了解如何处理以下代码以检索具有指定id.

在我的视图文件中,我有:

@records = Users.all # This returns an array (class)

在另一个文件中,一个部分模板,我想检索,例如,用户为id1,但如果我这样做:

@records.find(1)

我得到enumerator所有记录的(类):

<Enumerator: [<Users id: 1, ... ] >

如何找到具有id1(或其他 ID)“a là Ruby on Rails Way”的用户?


更新

@records = Users.all在视图文件中使用,因为我的目标是尽量减少对数据库的调用,因为我需要遍历几乎所有记录并检查它们是否存在。例如,如果我这样做:

some_hash.each { |key, value|
  put User.find(value)
}

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

4

4 回答 4

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
于 2011-06-13T23:34:04.160 回答
1

使用User.scoped而不是User.all. #all立即查询数据库并返回一个数组,而#scoped将返回一个ActiveRecord::Relation可以链接进一步查询的对象。在这种情况下,除非您尝试以某种方式检查或枚举结果,否则不会命中数据库

于 2011-06-14T00:02:09.060 回答
0

其实你误会了。@records.find(1)正在返回 Enumerator 类的对象(与 Enumerator 类本身不同)。

这里的问题是,正如您所指出的,@records它是一个数组,而不是一个 ActiveRecord 对象,并且Array#find继承自Enumerable#find--which,当没有给定块时,返回类 Enumerable 的对象)与ActiveRecord::Base#find(即User#find)。

您应该做的是,在您的控制器中,选择您想要的一个用户记录:

@user = User.find 1

...然后@user直接在您的模板中使用。一般来说,您应该避免find在模板中进行 ActiveRecord 查找(例如)。这种逻辑应该发生在您的控制器中。

于 2011-06-13T23:13:33.043 回答
0

上次对于这种情况,我最终这样做了:

@assignments = Assignment.find_by_sql(' ... ')

@assignments.find(id: 1).first
于 2013-05-03T07:48:15.540 回答