2011-07-11 45 views
2

我有一个用户对象说我暴露通过简单的调用:遍历2模型对象轨道

@users = User.all 

我也有一些更昂贵的疑问我在做,我正在使用自定义的SQL来生成结果。

@comment_counts = User.received_comment_counts 

这个调用和其他喜欢它的人会在我的列表中按照id排序的每个用户返回一个元素的对象。

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

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

我想不出如何做到这一点。我也似乎无法弄清楚如何从@comment_counts结果中获取单个记录,而无需通过@ comment_counts.each运行它。

是不是有一些方法为这些lits对象中的每一个构建迭代器,转储他们进入一个while循环并在循环的每个循环中单独执行迭代器?另外,如果你可以回答这个问题,我可以去哪里了解如何在列表中逐步列表。

回答

4

像这样的东西应该为你工作:

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

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

+0

@comment_counts是一个Mysql2 ::结果,所以我得到的错误 - 无法将Mysql2 :: Result转换为数组。这真的很有趣。 – walta

+0

啊,你需要首先从'@ comment_counts'的查询结果中获取数据。如果你不熟悉的话,这里有一个例子:http://rubydoc.info/gems/mysql2/0.3.6/frames –

+0

这样做的技巧 - 和rubydoc.info引用是有用的thankya! – walta

3

假设阵列具有相等的值:

在你的控制器:

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

在您的视图。

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

然后,你可以检查是否存在价值观上@comments,如果你不知道,如果阵列具有相同数量的对象。

0

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

  1. Eager loading只适用于相关型号,而不是这里的情况。比如说,你的每个用户都有comments,所以编写User.includes(:comments).all会返回所有用户的评论,只做2个查询来获取数据。

  2. 要统计每个用户的评论,您可以使用counter_cache (clickable)。然后,您将在users表中有一个字段用于缓存用户有多少评论。再次,仅适用于相关联的Comment