2016-11-27 2 views
4

これは可能ですが、私はRepo.getがStructを返すのが好きです。Repo.getでRepo.oneのようにselectを使用する方法

私のような何かやろうとしている

:のように

Repo.get(User, id, select: [:id, :name]) 

Repo.one(from u in User, where: u.id == ^id, select: [u.id, u.name] 

しかしRepo.getとをそれが可能だとどのようにすれば、私はエクトのドキュメントから把握することはできませんこれを達成する。

コンテキスト:私はガーディアンを使用していますし、シリアライザのようなものが行われます。

def from_token("User:" <> id), do: {:ok, Repo.get(User, id,)} 

を私はcurrent_resource(conn)を呼び出すときに、私は便利なユーザ構造体を取得します。しかし、このクエリは、私がフィルタリングしようとしているデータベースからユーザのすべての情報を返します(例えば、私はcurrent_resource(conn)に暗号化されたパスワードを必要としません)。

+0

structの代わりに 'id'と' name'を含むリストと、 'Repo.get'を使って与えられたUserが存在しない場合は' nil'が必要ですか? – Dogbert

+0

Repo.getのようなstruct/nilが必要です。このリストは「望ましい動作」ではありません。 IDと名前はちょうどexemplesです。 –

+0

ドキュメントで述べたように、Repo.getは構造体を返していますが、Repo.oneは構造体を返していません。しかし、私はRepo.oneでselectを使用することができ、Repo.getでselectを使用する方法を理解することはできません。 –

答えて

1

@Dogbertのコメントには、

import Ecto.Query 

from(User) |> select([:id, :name]) |> Repo.get(id) 

そして保護者のシリアライザ内側:

import Ecto.Query 

.... 

def from_token("User:" <> id), do: {:ok, from(User) |> select([:id, :name]) |> Repo.get(id)} 

..... 

Ecto.Repoドキュメントから:

(照会可能、id、opts) get(queryable :: Ecto.Queryable.t、id :: term、opts :: Keyword.t):: Ecto.Schema.t |

nil | no_return

プライマリキーが指定されたIDと一致するデータストアから単一の構造体を取得します。

結果が見つからない場合はnilを返します。クエリ可能な構造体に1つ以上の主キーがない場合、引数エラーが発生します。

言い換えれば、get/3が待っている最初の引数はクエリ可能です。そのため、from(User) |> select([:id, :name])でクエリ可能な構造を構築し、それをRepo.get(id)に返すのは

userモデルに基づく構造体を返します。

そしてphoenix-framework docsはmentionnedとして:

各モデルは、私たちのスキーマの分野だけでなく、自分のタイプを定義します。 それぞれは、スキーマ内の同じフィールドを持つ構造体を定義します。

したがって、返される構造体にはモデル/スキーマにすべてのフィールドが記述されますが、選択されていないnil値が設定されます。

関連する問題