2016-10-06 6 views
1

私はUserモデルを持っています。has_manyPostです。アソシエーションをプリロードしてectoに戻すにはどうしたらいいですか?

私は、ユーザーフェッチ:

user = Repo.get(User, 1) 

を、今私は、このユーザーの全ての投稿を取得したいです。私が見つけた唯一の解決策は、次のようなものです:

posts = Repo.preload(user, :posts).posts 

しかし、それは醜いです。それには省略形はありますか?

答えて

4

すべての記事のためのクエリを取得し、実際にそれらを取得するためにRepo.all/1にそれを渡すためにEcto.assoc/2を使用することができます。

iex(1)> user = Repo.get(User, 1) 
iex(2)> Ecto.assoc(user, :posts) 
#Ecto.Query<from p in MyApp.Post, where: p.user_id == ^1> 
iex(3)> Ecto.assoc(user, :posts) |> Repo.all 
[debug] QUERY OK source="posts" db=2.4ms 
SELECT p0."id", p0."title", p0."user_id", p0."inserted_at", p0."updated_at" FROM "posts" AS p0 WHERE (p0."user_id" = $1) [1] 
... 
+0

の省略形です'assoc'と' preload'の違いは? – arpit

+0

'assoc'は、dbからデータを取得せずに特定の関連付けのクエリを作成し、' preload'はネストされた関連付けを含む関連付けのためにdbからデータを取得します。 – Voldy

+0

'preload/2'は親レコード(この場合user)と関連レコード(posts)を1つのデータ構造体に返しますが、' assoc/2'は 'Repo.all'にパイプされて関連レコード投稿)。つまり、親レコードが必要な場合は、(上記の例のように)親レコードを別々に取得することができますが、パイプステートメントとして完全に書き込むとそのデータは保持されません。 – tomf

0
user = Repo.get(User, 1) |> preload(:posts) 

は何あなたのケース

0
user = Repo.get(User, 1) |> Repo.preload([:posts]) 
+0

このコードは質問に答えるかもしれませんが、通常はコードが何をしているのかの説明を追加することをお勧めします。これにより、この分野に精通していない開発者は、コード内で何が起こっているのかを理解することができ、将来どのように問題を解決するかを学ぶのに役立ちます。 –

関連する問題