4

単純な呼び出しで公開しているユーザーオブジェクトがあります。

@users = User.all

また、カスタムSQLを使用して結果を生成している場合に、より高価なクエリを実行しています。

@comment_counts = User.received_comment_counts

この呼び出しやその他の呼び出しは、ID順にリスト内のユーザーごとに1つの要素を持つオブジェクトを返します。

私の見解では、ユーザーとcomment_countsオブジェクトを同時にループしたいと思います。例えば:

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

これを行う方法がわかりません。また、@ comment_counts.eachを実行せずに、@comment_countsの結果から個々のレコードを取得する方法を理解できないようです。

これらの点灯しているオブジェクトごとにイテレータを作成し、それらを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つのコレクションのループのみが必要になるようにする必要があります。これを達成するための2つの可能な方法を考えることができます:

  1. 積極的な読み込み関連するモデルでのみ機能しますが、ここではおそらく機能しません。たとえば、各ユーザーが持っているcommentsので、書くUser.includes(:comments).allとすべてのユーザーにコメントが返され、データを取得するために2つのクエリのみが実行されます。

  2. 各ユーザーのコメントを数えるには、counter_cache(クリック可能)を使用できます。users次に、ユーザーのコメント数をキャッシュするためのフィールドがテーブルにもう1つあります。繰り返しますが、関連付けられたCommentsに対してのみ機能します。

于 2014-06-11T09:03:35.260 に答える