2016-12-26 7 views
0

ユーザーを検索する必要がありますが、別のテーブル(パートナー)にも参加する必要があります。エリクシルRepo.find_by()に参加するにはどうすればいいですか?

result = Repo.get_by(User, login: auth.info.email) 

ユーザテーブルがパートナー表に外部キーを持っているので、私はこれをしようと思った:

result = Repo.get_by(User, %{ login: auth.info.email, join: :partner }) 

しかし、これは、その結果:

field `User.join` in `where` does not exist in the schema in query: 
ここでは参加せずに作業コードです

だから、明らかに列名として結合を取っています。 私はあらかじめロードしたくありません。なぜなら - 私が理解するように、これはメモリ内のテーブル全体をロードし、大きなものになる可能性があるため、データベースレベルでの結合が必要です。

+0

'preload'は、テーブル全体ではなく、選択されたユーザに関連付けられたレコードのみを読み込みます。 – Dogbert

+0

この場合の使用方法の例を挙げることはできますか?私はあなたの答えを受け入れたものとしてマークします。 – raarts

答えて

1

これは、私が理解するように、これはメモリ内のテーブル全体をロードするため、大きなものになる可能性があるため、データベースレベルで結合が必要です。

プリロードでは、テーブル全体がメモリにロードされず、特定の外部キーが指定された構造体のIDと一致するレコードのみが読み込まれます。

:partnerUserbelongs_toまたはhas_manyまたはhas_one関係のいずれかで、あなたはこのようにそれをロードすることができますと仮定:

user = Repo.get_by!(User, login: auth.info.email) |> Repo.preload(:partner) 

あなたが見つかりませ記録にnilを返すようにRepo.get_byに頼っている場合、あなたは」 Repo.preloadは、最初の引数としてnilを渡すとエラーが発生するため、このケースを自分で処理する必要があります:

user = if u = Repo.get_by(User, login: auth.info.email), do: Repo.preload(u, :partner), else: nil 

のいずれかを入力した後、partneruser.partnerとしてアクセスできます。

+0

これはジョインを処理する方法ですか、それともより良い方法ですか? – raarts

関連する問題