这段代码很难看,怎么做得更好?
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
答案 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? }