Rails group_by和相关模型中的字段排序

时间:2016-08-11 10:28:38

标签: ruby-on-rails

我有一个属于User_type的用户。在user_type模型中,有一个名为position的字段,用于在显示user_types及其用户时处理默认排序。

使用Ransack进行搜索时,Unfortunataly不起作用,因此我需要从User模型中搜索并使用group_by根据其user_type_id对记录进行分组。

这很好用,但我需要一种方法来尊重user_type模型中定义的排序。这也是动态的,因此无法告知用户模型的排序。

因此我认为我需要循环遍历group_by数组并手动进行排序。但我不知道从哪里开始。这是控制器方法:

  def index
    @q = User.ransack(params[:q])
    @users = @q.result(distinct: true).group_by &:user_type
  end

如何操作该数组以对相关模型中的字段进行排序?

2 个答案:

答案 0 :(得分:0)

尝试将此行添加到Usertype模型

default_scope order('position')

答案 1 :(得分:0)

首先,存在n + 1个查询问题。您没有将user_types表加入users并且应用程序在user_types上调用SELECT n次,其中n是用户数+另一个用于抓取用户的SELECT调用:

  ...
  UserType Load (0.2ms)  SELECT  "user_types".* FROM "user_types" WHERE "user_types"."id" = $1 LIMIT 1  [["id", 29]]
  UserType Load (0.2ms)  SELECT  "user_types".* FROM "user_types" WHERE "user_types"."id" = $1 LIMIT 1  [["id", 7]]
  ...

因此,您需要包含user_types并按user_types.position排序:

@q.result(distinct: true).includes(:user_type).order('user_types.position')

这里有很多订购示例:

http://apidock.com/rails/ActiveRecord/QueryMethods/order

您的案例(订购协议)也可用

有关n + 1查询的信息:

What is SELECT N+1?