我有一个属于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
如何操作该数组以对相关模型中的字段进行排序?
答案 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查询的信息: