2017-02-28 10 views
0

問題に遭遇前に出会ったことはありませんでした。どこでも解決方法を見つけることができませんでした。基本的に私はinvited_by_id列を含むusersテーブルを持ち、同じusersテーブルを参照しています。Rails - 自己参照による注文

私は今、しかし、実際にテーブルの両方のため

User 
.includes(:invited_by) 
.order("users.name ASC") 

を動作しません。ここに仕分け通常のアクティブなレコードを使用して、それが魅力的なユーザー名に基づいて結果をソートするクエリを作成しようとしています質問は同じです、それは最初のものを選んでおり、invited_by関連ではないようです。

アソシエーションを発注する方法はありますか?

さらに詳細

私は、アクティブレコードミックスインでこれを使用しようとしていますので、私は、基本クラスでこれを直接呼び出すことはありません、それは混合として既存のスコープで作業する必要がありますメソッドがスコープで呼び出されます。例えばここ

User 
.includes(:invited_by) 
.where(where_clause) 
.sort(:invited_by_name, :asc) 

ため、sort方法は、ミックスインによって提供される、それはテーブルを区別できるようにする必要がある場合、これはです。私はそれが関係が何であるかを知っていることを意味する論理を持っているので、:invited_by_nameは:invited_by関係の名前列ですが、それは私が持っている限りです。

答えて

0

異なる名前で同じ表を参照する必要があります。 Arelでこれを行うことができます

guest = Arel::Table.new(:users, :as => 'guest') 
inviter = Arel::Table.new(:users, :as => 'inviter') 

relation = guest. 
    project(Arel.sql('*')). 
    join(inviter).on(guest[:invited_by_id].eq(inviter[:id])). 
    order(inviter[:name]) 

@users = relation.to_sql 
+0

これは既存のスコープでは機能しますか?これが行われる場所は、ミックスインの中にあり、チェーンされているので、ユーザーモデルではなく既存のスコープで作業する必要があります。 – PaReeOhNos

+0

ああ、私はそれが動作しているか、それを試してみることができません。私はアールをスコープでグーグル・グーグルで見つけただけで、使えるものは何も見ていない。変更されたArelノードについてのこのブログのエントリがありますが、私はあなたにとってどれほど役立つか分かりません... https://www.viget.com/articles/composable-sql-queries-in-rails-using-arel – SteveTurczyn

+0

うーん、それは私の問題です:(掘り続ける – PaReeOhNos