我想将我的类方法重写为范围。
class Team
def self.grouped
self.all.group_by { |e| e.type }.map { |k, v| { k => v.group_by { |e| e.sub_type } } }
end
end
我如何写作范围?
class Team
# scope :grouped ??
end
答案 0 :(得分:1)
您不能将其写为范围。 Rails中的作用域作用于ActiveRecord::Relation
个对象,并且应该生成针对数据库运行的SQL
个查询。
但是从数据库收到数据后,group_by
上会调用array
方法。
在使用group_by
对数据进行分组之前,您必须先从数据库加载数据。
您可以在Array上编写自己的nested_group_by
方法:
class Array
def nested_grouped_by(group_1, group_2)
group_by { |e| e.send(group_1) }.
map { |k, v| { k => v.group_by { |e| e.send(group_2) } } }
end
end
可以这样使用:
Team.all.nested_grouped_by(:type, :subtype)
请注意all
强制范围实际从数据库加载数据并返回数组。