2016-08-11 12 views
0

私はUser_typeに属するUserを持っています。 user_typeモデルには、user_typesとそのユーザーを表示するときのデフォルトのソートを処理するpositionというフィールドがあります。関連するモデルのフィールドgroup_byとソート

不幸なことに、これはRansackで検索する場合は機能しません。そのため、Userモデルから検索し、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は、いずれの場合に使用するのは良いアイデアではありません。予期しない動作が発生する可能性があります。スコープを作成するか、純粋な 'order'メソッドを使用する方が良いです。 –

+0

UserTypeから実行されたクエリがないため、これは機能しません。 –

0

すべての最初のn + 1クエリー問題があるに次の行を追加してみてください。あなたはusersuser_typesテーブルに参加していないと、アプリケーションの呼び出しは、nは、ユーザ数+別の一つですuser_types n回は、ユーザーをつかむために呼び出すSELECTの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.positionによってuser_typesと秩序を含める必要があります。

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

ここに注文するための多くの例があります。

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

(協会に発注)10

あなたの場合も、N + 1つのクエリに関する利用可能な

情報です:

What is SELECT N+1?

+0

さて、それは動作します、ありがとう!私はこれがuser_typeを尊重するとは思わなかった。グループ内のユーザーを並べ替える方法もありますか? –

+0

@ bo-ozあなたの質問を編集して、グループとユーザーとの関連付けの例と問題を提示します。私は解答で私の答えを広げます。 –

関連する問題