如何将rails group_by类方法重写为作用域

时间:2016-04-03 19:32:55

标签: ruby-on-rails ruby ruby-on-rails-4 scope refactoring

我想将我的类方法重写为范围。

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

1 个答案:

答案 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强制范围实际从数据库加载数据并返回数组。