2013-03-20 84 views
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的给我的最大性能有效的方式。

我想用项目和<LI>来显示一个<UL>,其中包含用户名和该特定用户的分数。我想出了一些使用injectmap将阵列转换为散列的解决方案,但是,我觉得有更好的方法来做这样的事情。

我想这样做:

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

难道你不能用这些实体之间的ActiveRecord关系来管理它吗? http://guides.rubyonrails.org/association_basics.html – fmendez 2013-03-20 20:56:24

+0

这只是纯粹的红宝石,没有导轨的宝石。在我只是试图传达我希望看到的结果的例子中,我不应该使用ERB。没有ActiveRecord,我只有这3个数组。谢谢! – user2192616 2013-03-20 21:19:11

回答

3

做事情像你在谈论(迭代模型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 

你应该能够做到沿着这些线路一般为每个数组的东西。

+1

+1“'担心这种方法或其他方法的性能可能不成熟” – 2013-03-20 21:00:39

+0

嗨,感谢您的快速响应,也许我需要重新提出问题。我并不担心视图层,甚至可以使用递归部分。然而,困扰我虚弱头脑的问题是,找到一种方法将这些数组变成可能是散列,如嵌套资源。如果愿意的话,考虑将points_due作为连接表,根据它们的id找到数组内的关系。类似hash的东西会不会提供类似于db schema中索引的更好结果? – user2192616 2013-03-20 21:08:28

+0

另外请记住,只是迭代的项目数组与给出的例子不会给我想要的结果。 @points_due数组是项目和用户之间的链接。 – user2192616 2013-03-20 21:11:09