2016-11-15 5 views
3

私はfield :owned_by_id, :stringを含むEctoスキーマを持っています。私は "abc123"のような値と "123"のような値をサポートする必要があるので、フィールドを文字列として宣言しました。なぜEctoの `cast`は整数を文字列に変換しないのですか?

docs for cast/3は言う:

2番目の引数はdataから種別情報に基づいてキャストされているのparamsのマップです。私はこれを行うと

def changeset(struct, params \\ %{}) do 
    cast(struct, params, [:owned_by_id]) 
end 

MyModule.changeset(%MyModule{}, %{owned_by_id: 1}) 

...私は文字列にそのowned_by_id整数のparamをオンにするcastを期待

私のモジュールで

、私はchangesetのように定義します、field宣言に基づいています。

しかし、私が代わりに取得することは

errors: [owned_by_id: {"is invalid", [type: :string]}] 

を含んチェンジである私はInteger.to_string(1)自分自身を呼び出すことができますが、castはそれを扱うべきではないのですか?これを自動的に処理する方法はありますか?

答えて

3

ドキュメントでは、パラメータが「型情報に従ってキャストされている」と言いますが、EctoはInteger-> Stringのキャストを実装していません。私が推測しているのは、これがほとんど必要でない理由は、String - > Integer変換が、すべてのフィールドが文字列として到着するWebフォームを介して入力が送信されるときに便利です。


この種の変換が必要な場合は、カスタムタイプを作成できます。ドキュメントには、似た何かを実装するカスタムタイプの例があります。

def type, do: :string 

def cast(integer) when is_integer(integer) do 
    {:ok, Integer.to_string(integer)} 
end 
def cast(string) when is_binary(string), do: {:ok, string} 
def cast(_), do: :error 

... 

注:私はこれを行うことはお勧めしませんhttps://github.com/elixir-ecto/ecto/blob/d40008db48ec26967b847c3661cbc0dbaf847454/lib/ecto/type.ex#L29-L40

あなたのタイプは、次のようになります。私の意見では、上記のドキュメントの例のように複雑なものを実装していない限り、明示的な変換はより簡単になります。

+0

バグのような感じです。 –

関連する問題