あなたが話しているようなことをする(モデル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
配列ごとに、これらの一般的な線に沿って何かを行うことができるはずです。