0

私はこれらの配列を持っています:

 @users = [[1,'Mark'],[2,'Bill'],[3,'John']]
 @projects = [[1,'Change the world'],[2,'Build a computer'],[3,'Run in a circle']]
 @points_due = [[1,1,"40"],[1,3,"80"],[2,1,"20"]]

私にはいくつかの解決策がありますが、ActiveRecord を介して結果が得られたかのように、これらすべての項目を反復する最もパフォーマンス効率の高い方法を探しています。

<UL>をプロジェクトとともに表示<LI>し、ユーザー名とその特定のユーザーによるポイントを表示したいと考えています。injectandを使用して配列をハッシュに変換するいくつかのソリューションを思いつきましたが、mapそのようなことを行うためのより良い方法があると感じています。

私は次のようなことをしたいと思います:

@projects.each do |project|
  <%= project.name %>
  <ul>
  project.each do |user|
    <li><%= user.name %> | <%= user.points_due %></li>
  end
  </ul>
end
4

1 に答える 1

3

あなたが話しているようなことをする(モデルXを繰り返してから、モデルYごとに何かを表示する)には、ネストされた.eachループ(多かれ少なかれ質問に含まれているものに似ています)はかなり標準的です方法。表示が複雑になり始めたら、それを 1 つまたは複数のパーシャルのレイヤーに抽出することがあります。

この方法や他の方法のパフォーマンスについて心配するのは、せいぜい時期尚早です。データ構造を操作するさまざまな方法のパフォーマンスは、ページの全体的なパフォーマンスに大きな影響を与えることはありません。何かが動いたら、それが実際に遅いどうかを確認してから、それを速くする方法を考えます。

あなたのコメントに基づいて編集してください:ハッシュの配列(キーのシンボルを含む)は、おそらくこのデータの配列の配列よりも優れているでしょう。パフォーマンスが向上するからではなく、コードがより理解しやすくなるからです (他の誰もコードに取り組んでいなくても、自分にとっては)。

考慮事項: AR オブジェクトを使用して、次のようにして各プロジェクトの名前を出力します。

@projects.each do |project|
  puts project.name
end

ハッシュを使用してこの動作をシミュレートする場合:

@projects.each do |project|
  puts project[:name]
end

配列を使用する一方で:

@projects.each do |project|
  puts project[1]
end

覚えるのがはるかに難しく、コードが属性を適切な順序で配置していることを確認する必要があります。または、名前ではなく、プロジェクトの他の側面である可能性があります。

あなたが私に同意し、この構造(@projects = [{:title => 'foo', 'id' => 1}, {:title => 'bar', :id => 2}]など)を使用していると仮定すると、ここにあなたが言及した反復を実行する方法があり@points_dueます.そのプロジェクトにいくつかあります:

@projects.each do |project|
  puts project[:name]
  @points_due.select{|pd| pd[:project_id] == project[:id] }.each do |project_points|
    user = @users.select{|u| u[:id] == project_points[:user_id]}.first
    puts "#{user[:name]} has #{project_points[:points]} points due on this project."
  end
end

これがあなたが望む出力に近似していることを願っていますが、そうでない場合は、例として使用するのはかなり簡単なはず.selectです.

2 番目の編集:配列をハッシュに変換する:

@projects_as_arrays = [[1,'Change the world'],[2,'Build a computer'],[3,'Run in a circle']]
@projects_as_hashes = @projects_as_array.map do |p_arr|
  {:id => p_arr[0], :name => p_arr[1]}
end

配列ごとに、これらの一般的な線に沿って何かを行うことができるはずです。

于 2013-03-20T20:55:43.387 に答える