5

データベースから日付/時刻型をロードするとき、Ecto は Ecto.DateTime 型にキャストします。JSON 文字列からモデルをロードするときに、同じ型キャストをどのように適用できますか

defmodule Rocket.User do
  use Rocket.Model

  schema "users" do
    field :created_at, :datetime
    field :name, :string
    field :email, :string
    field :password, :string
    field :timezone, :string
  end
end

iex(40)> Poison.decode!(~s({"created_at":"2015-01-21T06:05:10.891Z"}), as: Rocket.User)  
%Rocket.User{created_at: "2015-01-21T06:05:10.891Z", email: nil, id: nil,
 name: nil, password: nil, timezone: nil}
4

1 に答える 1

6

Ecto 0.6.0 を使用している場合、最良の方法はチェンジセットを使用することです:

Ecto.Changeset.cast Poison.decode!(data), %Rocket.User{},
                    ~w(required_fields), ~w(optional_fields)

モデルに追加する前に、このデータをキャスト、フィルター、および検証する必要があるため、これを外部データとして受け取る場合は、changeset の使用が実際に推奨されます。それらの詳細については、Ecto の紹介Ecto.Changesetモジュールのドキュメントを参照してください。

ただし、1 つ問題が残っています: Ecto は文字列を datetime にキャストする方法を知りません。ただし、カスタム型を使用して方法を教えることができます。以下のテンプレートを作成しました。キャスト機能を実装するだけです。

https://gist.github.com/josevalim/1ed574b388c32f056da1

次に、スキーマで:

timestamps type: Rocket.DateTime

詳細については、Ecto.Typeドキュメントを参照してください。Ecto でこれを改善する必要があることは承知しています。少なくとも、JSON で指定された形式で日時を解析できるはずです。

于 2015-01-21T11:15:37.977 に答える