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>带有项目的 a,以及一个<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循环(或多或少类似于您在问题中包含的那个)是一个非常标准方法。如果显示开始变得复杂,您可以将其提取为一层或多层分音。

担心这种或其他方法的性能充其量可能为时过早。操作数据结构的不同方式的性能不会成为影响页面整体性能的重要因素。一旦你有一些工作,看看它是否真的很慢,然后担心如何让它更快。

根据您的评论进行编辑:对于此数据,哈希数组(带有键符号)可能比数组数组更好。不是因为它们的性能更高,而是因为它会让你的代码更容易理解(对你自己来说,即使没有其他人在它上面工作过)。

考虑:使用 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

您应该能够按照这些一般路线为每个阵列做一些事情。

于 2013-03-20T20:55:43.387 回答