Ruby on rails 一次循环通过2个模型对象
我有一个用户对象,通过简单调用公开:Ruby on rails 一次循环通过2个模型对象,ruby-on-rails,ruby,iterator,mysql2,Ruby On Rails,Ruby,Iterator,Mysql2,我有一个用户对象,通过简单调用公开: @users = User.all 我还有一些更昂贵的查询,我正在使用自定义SQL生成结果 @comment_counts = User.received_comment_counts 这个调用和其他类似的调用将返回对象,在我的列表中,每个用户有一个按id排序的元素 在我看来,我希望同时遍历用户和comment\u counts对象。例如: for user, comment_count in @users, @comment_counts do end
@users = User.all
我还有一些更昂贵的查询,我正在使用自定义SQL生成结果
@comment_counts = User.received_comment_counts
这个调用和其他类似的调用将返回对象,在我的列表中,每个用户有一个按id排序的元素
在我看来,我希望同时遍历用户和comment\u counts对象。例如:
for user, comment_count in @users, @comment_counts do
end
我不知道该怎么做。我似乎也不知道如何从@comment\u counts结果中获取单个记录,而不通过@comment\u counts.each运行它
是否有一些方法可以为这些lits对象中的每一个构建迭代器,将它们转储到while循环中,并在循环的每个过程中分别步进迭代器?另外,如果您能回答这个问题,我可以去哪里学习如何单步执行rails中的列表。假设数组具有相等的值: 在控制器中:
@users = User.all
@comments = Comment.all
在你看来
<% @users.each_with_index do |user, i |%>
<% debug user %>
<% debug @comments[i] %>
<% end %>
如果不知道数组中是否有相同数量的对象,则只需检查
@comments
上是否存在这些值 像这样的东西应该适合你:
@users.zip(@comment_counts).each do |user, comments_count|
# Do something
end
我从未在Ruby中遇到过对迭代器的手动操作,更不用说这是不可能做到的。这样的代码可能会很混乱,因此我可能会倾向于更优雅的解决方案。这并不明显,因为您的数据需要进行一些重构<代码>注释计数显然属于
用户
的实例,应该反映这一点,以便只需要在一个集合(用户的集合)上循环。我可以想出两种可能的方法来实现这一点:
注释
,因此编写User.includes(:comments)。all
将返回所有用户及其注释,并且只执行两次查询以获取数据users
表中还有一个字段用于缓存用户的注释数量。同样,仅适用于关联的注释
@comment_counts是一个Mysql2::Result,因此我得到了错误-无法将Mysql2::Result转换为数组。不过这真的很有趣。啊,你需要先从
@comment\u counts
的查询结果中获取数据。如果您不熟悉,这里有一个例子:这就成功了,rubydoc.info引用非常有用,谢谢!