【发布时间】:2020-04-14 09:14:38
【问题描述】:
我是长生不老药的新手。我有一个 Ecto 架构
defmodule MyScoreSchema do
use Ecto.Schema
import Ecto.Changeset
schema "historical_extra_fuels" do
field :average, :float
field :count, :float
field :percent, :float
field :name, :string
end
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:average, :count, :percent])
|> validate_required([])
end
end
和父架构
defmodule OverallScore do
use Ecto.Schema
import Ecto.Changeset
schema "OverallScore" do
field :avg_pass, :float
field :avg_fail, :float
field :total_students, :float
embeds_many :my_score_schema, MyScoreSchema
end
@required_fields ~w[]a
@optional_fields ~w[avg_pass, avg_fail, total_students ]a
def changeset(struct, params \\ %{}) do
struct
|> cast(params, @optional_fields, required: false )
|> cast_embed(:my_score_schema, required: false)
end
end
并且有一个 HTTP REST API http://localhost:8080/getScoreData 提供数据
{
"avgPass": 85.55,
"avgFail": 14.45,
"totalStudents": 80.0,
"myScoreSchema": [
{
"average": 80.0,
"count": 8.0,
"percent": 80.0,
"name": "John"
},
{
"average": 90.0,
"count": 8.0,
"percent": 90.0,
"name": "Cena"
},
{
"average": 80.0,
"count": 8.0,
"percent": 80.0,
"name": "Sunny"
},
{
"average": 70.0,
"count": 8.0,
"percent": 70.0,
"name": "Michael"
}
]
}
和代码
url = "http://localhost:8080/getScoreData"
Logger.info("the url is #{url}")
case HTTPoison.get(url) do
{:ok, %{status_code: 200, body: body}} ->
overall_score = Jason.decode!(body, as: [%OverallScore{}])
{:ok, overall_score}
end
这在某种程度上可行并且不会出错,但结果是一些 struct 而不是真正的 OverallScore ecto schema object
【问题讨论】:
-
结果如何?你收到一个
%OverallScore{},为什么要尝试编码到列表中? -
您在哪里发现
Jason.decode!/1接受as:选项?
标签: json elixir ecto elixir-poison httpoison