同时遍历两个Rails模型对象

4

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

@users = User.all

我还在进行一些更昂贵的查询,其中我使用自定义SQL来生成结果。

@comment_counts = User.received_comment_counts

这个调用以及其他类似的调用将按id顺序返回每个用户列表中的一个元素对象。

我希望能同时遍历用户和评论计数对象。例如:

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

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

难道没有一种方法可以为每个lits对象构建一个迭代器,将它们倒入while循环中,并在循环的每次通过中逐个步进迭代器吗?此外,如果您能回答这个问题,我可以去哪里学习关于在rails中遍历列表。

3个回答

7
以下内容可能适合您:

类似以下内容应该适合您:

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

我从未在Ruby中遇到手动操作迭代器,这并不意味着不能这样做。像那样的代码可能会很混乱,因此我更倾向于使用更优雅的解决方案。


@comment_counts 是一个 Mysql2::Result,所以我得到了错误 - 无法将 Mysql2::Result 转换为 Array。不过这真的很有趣。 - walta
啊,你需要先从 @comment_counts 的查询结果中获取数据。如果你对此不熟悉,可以参考这个例子:http://rubydoc.info/gems/mysql2/0.3.6/frames - Wizard of Ogz
做到了 - 而且 rubydoc.info 的参考资料很有用,谢谢! - 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)上循环。我可以想到两种可能的方法来实现这一点:

  1. 渴望加载。仅适用于关联模型,这里可能不是这种情况。比如,每个用户都有评论,那么编写 User.includes(:comments).all 将返回所有带有评论的用户,并且只执行 2 个查询以获取数据。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接