要执行您正在谈论的事情(迭代模型 X,然后为每个模型 Y 显示某些内容),嵌套.each
循环(或多或少类似于您在问题中包含的那个)是一个非常标准方法。如果显示开始变得复杂,您可以将其提取为一层或多层分音。
担心这种或其他方法的性能充其量可能为时过早。操作数据结构的不同方式的性能不会成为影响页面整体性能的重要因素。一旦你有一些工作,看看它是否真的很慢,然后担心如何让它更快。
根据您的评论进行编辑:对于此数据,哈希数组(带有键符号)可能比数组数组更好。不是因为它们的性能更高,而是因为它会让你的代码更容易理解(对你自己来说,即使没有其他人在它上面工作过)。
考虑:使用 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
可能会完成它。
编辑第二个:将数组转换为哈希:
@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
您应该能够按照这些一般路线为每个阵列做一些事情。