我是长生不老药的新手。我有一个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
发布于 2020-04-14 10:23:16
我建议您在模型中使用已有的变更集,而不是使用"as:%OverallScore{}“语法。这看起来像这样:
url = "http://localhost:8080/getScoreData"
Logger.info("the url is #{url}")
case HTTPoison.get(url) do
{:ok, %{status_code: 200, body: body}} ->
response = Jason.decode!(body)
overall_score = OverallScore.changeset(%OverallScore{}, response)
{:ok, overall_score}
end
变更集通常是将对象放入ecto结构的最佳方式,因为它们将正确地运行您的变更集验证。这还有一个额外的好处,那就是它可以在"response“字段中删除任何不在变更集的cast调用中的内容,而不会出现任何错误。您还可以快速检查它是否有效,如果是,您可以使用ecto repo将其插入到数据库中。
https://stackoverflow.com/questions/61204295
复制