本文介绍了如何键入强制解码JSON,就像它来自数据库一样的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

从数据库加载日期/时间类型时,Ecto将转换为Ecto.DateTime类型。从JSON字符串加载模型时如何应用相同类型的转换

When loading date/time types from the database, Ecto will cast to a Ecto.DateTime type. How can the same type casting be applied when loading a model from a JSON string

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}


推荐答案

如果使用的是Ecto 0.6.0,最好的方法是使用变更集:

If you are using Ecto 0.6.0, the best way is to use changesets:

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

如果您将其作为外部数据接收,则实际上建议使用变更集,因为您需要转换,过滤和验证该数据在将其添加到模型之前。您可以在Ecto简介和 Ecto.Changeset中找到有关它们的更多信息

然后在您的模式中:

timestamps type: Rocket.DateTime

您可以在 Ecto.Type 文档中找到更多信息。我知道我们需要在Ecto中对此进行改进,我认为我们至少应该能够以JSON中指定的格式解析日期时间。

You can find more information in Ecto.Type docs. I am aware we need to improve this in Ecto, I think we should at least be able to parse datetimes in the format specified in JSON.

这篇关于如何键入强制解码JSON,就像它来自数据库一样的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-25 14:28