ruby on rails-在类数组中查找类对象时遇到问题



我使用的是RubyonRails 3.0.7,我想了解如何处理以下代码,以便检索具有指定id的类对象。

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

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

在另一个文件,一个部分模板中,我想检索,例如,具有id 1的用户,但如果我这样做:

@records.find(1)

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

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

如何找到id1(或其他ID)为"a làRubyonRails Way"的用户


更新

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

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

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

尽管这可能很慢,而且我怀疑你正在开发的应用程序中有一些不太理想的设计(不是评判,我们都去过),但Array#索引似乎是你想要的:

@records[@records.index{|user| user.id == 1}]

编辑

虽然如果你需要为每个用户做一些事情,并且你需要通过id快速访问他们,我可能会在你的控制器中做这样的事情。即使它不是真的更快,它也更可读(对我来说):

@users_hash = {}
User.all.each{|user| @users_hash[user.id] = user}

然后在你的观点你可以做:

@users_hash[id].username

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

实际上你错了。@records.find(1)正在返回类Enumerator的对象(该对象与类Enumerator本身不同)。

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

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

@user = User.find 1

然后直接在模板中使用@user。通常,您应该避免在模板中执行ActiveRecord查找(例如find)。这种逻辑应该发生在控制器中。

上一次对于这种情况,我最终是这样做的:

@assignments = Assignment.find_by_sql(' ... ')
@assignments.find(id: 1).first

相关内容

  • 没有找到相关文章

最新更新