如何在ruby中按特定对象字段拆分对象数组?

时间:2011-08-30 11:18:25

标签: ruby arrays

这段代码很难看,怎么做得更好?

todos = Todo.all

@todos_1 = Array.new
@todos_2 = Array.new
@todos_3 = Array.new

todos.each do |doc|   
  if doc.category == nil 
    @ntodos_1 << doc 
  end
  if doc.category == "something" 
    @todos_2 << doc 
  end
  if doc.frame == "whatever" 
    @todos_3 << doc 
  end

3 个答案:

答案 0 :(得分:3)

您可以使用Todo.group("category").order("category")来组织结果集,然后循环显示结果集,因为您知道类别更改时您正处于下一个分组。

或者,为Todo模型创建范围可能很有用:

class Todo < ActiveRecord::Base
  scope :something, where(:category => "something")
  scope :whatever, where(:category => "whatever")
end

这将允许您将结果分配给实例变量,而不是迭代控制器中的所有结果:

@something = Todo.something
@whatever = Todo.whatever

答案 1 :(得分:1)

补充现有答案,我们假设您使用的是“普通”Ruby对象,而不是ORM:

todos_by_category = todos.group_by(&:category)

待用:

>> todos_by_category["some_category"]
#=> [todo1, todo2, ...]

答案 2 :(得分:0)

至少前两个如果可以在一个案例中合并:

todos.each do |doc|   
  case doc.category 
    when nil 
      @ntodos_1 << doc 
    when "something" 
      @todos_2 << doc 
  end
  if doc.frame == "whatever" 
    @todos_3 << doc 
  end      

你也知道elsif?     }