2016-08-11 55 views
0

我有一個用戶屬於User_type。在user_type模型中,有一個名爲position的字段來處理顯示user_types及其用戶時的默認排序。Rails group_by和相關模型中的字段排序

Unfortunataly在使用Ransack進行搜索時不起作用,所以我需要從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

嘗試將此行添加到Usertype模型

default_scope order('position')

+0

default_scope是不是在任何情況下使用是一個好主意。它可能會導致意外的行爲。最好創建範圍或使用純粹的「訂單」方法。 –

+0

這不起作用,因爲沒有從UserType進行查詢。 –

0

首先有N + 1查詢問題。你是不是加入user_typesusers和應用程序調用上的SELECT user_types n次,其中n是一個數字用戶+另外一個選擇通話吸引用戶:

... 
    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.position包括user_types與秩序:

@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?

+0

好的,它確實有用,謝謝!我不認爲這會尊重user_type。還有一種方法可以對所述組中的用戶進行排序嗎? –

+0

@ bo-oz通過編輯問題來提供有關組和用戶之間關聯的示例和問題。我將通過解決方案擴展我的答案。 –