4

我有一个通过简单调用公开的用户对象:

@users = User.all

我还有一些更昂贵的查询,我正在使用自定义 SQL 生成结果。

@comment_counts = User.received_comment_counts

此调用和其他类似调用将返回按 id 排序的列表中每个用户一个元素的对象。

在我看来,我想同时遍历 users 和 comment_counts 对象。例如:

for user, comment_count in @users, @comment_counts do
end

我不知道该怎么做。我似乎也无法弄清楚如何在不通过 @comment_counts.each 运行的情况下从 @comment_counts 结果中获取单个记录

是否有某种方法可以为这些 lits 对象中的每一个构建一个迭代器,将它们转储到一个 while 循环中,并在循环的每次传递中单独步进迭代器?另外,如果你能回答这个问题,我可以去哪里了解如何在 rails 中单步执行列表。

4

3 回答 3

7

像这样的东西应该适合你:

@users.zip(@comment_counts).each do |user, comments_count|
  # Do something
end

我从来没有遇到过在 Ruby 中手动操作迭代器的情况,并不是说它做不到。像这样的代码可能会很混乱,所以我可能会喜欢更优雅的解决方案。

于 2011-07-11T21:45:56.870 回答
3

假设数组具有相等的值:

在您的控制器中:

@users = User.all
@comments = Comment.all

在你看来。

<% @users.each_with_index do |user, i |%>
    <% debug user %>
    <% debug @comments[i] %>
<% end %>

@comments然后,如果您不知道数组是否具有相同数量的对象,则 可以检查这些值是否存在。

于 2011-07-11T21:45:20.130 回答
0

这并不明显,因为您的数据需要进行一些重组。comment_count显然属于的实例,User这应该得到反映,以便只需要对一个集合(Users)进行循环。我可以想到两种可能的方法来实现这一点:

  1. 急于加载仅适用于关联模型,此处可能并非如此。比如说,你的每个用户都有comments,所以写作User.includes(:comments).all会返回所有用户的评论,并且只做 2 次查询来获取数据。

  2. 要计算每个用户的评论,您可以使用counter_cache(clickable)。然后,您将在users表中多出一个字段,用于缓存用户拥有的评论数。同样,仅适用于关联Comment的 s。

于 2014-06-11T09:03:35.260 回答