私はUser
モデルを持っています。has_many
Post
です。アソシエーションをプリロードしてectoに戻すにはどうしたらいいですか?
私は、ユーザーフェッチ:
user = Repo.get(User, 1)
を、今私は、このユーザーの全ての投稿を取得したいです。私が見つけた唯一の解決策は、次のようなものです:
posts = Repo.preload(user, :posts).posts
しかし、それは醜いです。それには省略形はありますか?
私はUser
モデルを持っています。has_many
Post
です。アソシエーションをプリロードしてectoに戻すにはどうしたらいいですか?
私は、ユーザーフェッチ:
user = Repo.get(User, 1)
を、今私は、このユーザーの全ての投稿を取得したいです。私が見つけた唯一の解決策は、次のようなものです:
posts = Repo.preload(user, :posts).posts
しかし、それは醜いです。それには省略形はありますか?
すべての記事のためのクエリを取得し、実際にそれらを取得するために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]
...
user = Repo.get(User, 1) |> preload(:posts)
は何あなたのケース
user = Repo.get(User, 1) |> Repo.preload([:posts])
このコードは質問に答えるかもしれませんが、通常はコードが何をしているのかの説明を追加することをお勧めします。これにより、この分野に精通していない開発者は、コード内で何が起こっているのかを理解することができ、将来どのように問題を解決するかを学ぶのに役立ちます。 –
の省略形です'assoc'と' preload'の違いは? – arpit
'assoc'は、dbからデータを取得せずに特定の関連付けのクエリを作成し、' preload'はネストされた関連付けを含む関連付けのためにdbからデータを取得します。 – Voldy
'preload/2'は親レコード(この場合user)と関連レコード(posts)を1つのデータ構造体に返しますが、' assoc/2'は 'Repo.all'にパイプされて関連レコード投稿)。つまり、親レコードが必要な場合は、(上記の例のように)親レコードを別々に取得することができますが、パイプステートメントとして完全に書き込むとそのデータは保持されません。 – tomf