Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 将某些变更集字段强制转换为一个EXTO:map字段_Elixir_Ecto_Single Table Inheritance - Fatal编程技术网

Elixir 将某些变更集字段强制转换为一个EXTO:map字段

Elixir 将某些变更集字段强制转换为一个EXTO:map字段,elixir,ecto,single-table-inheritance,Elixir,Ecto,Single Table Inheritance,我有一个如下所示的变更集: %{ 创建者id:“4”, 名称:“使用GraphQL的测试”, 地点编号:“13”, 主菜编号:“8”, 基地:“小麦”, 类型:“食品” } 我的外星模式如下: schema“items”做什么 字段:类型,:字符串 字段:名称,:字符串 字段:数据,:地图 属于:创建者,Name.SubName.Creators 属于:地点,名称。子名称。地点 属于:entre,Name.SubName.entre 时间戳() 结束 正如您所看到的,base不是一个在ext

我有一个如下所示的变更集:

%{
创建者id:“4”,
名称:“使用GraphQL的测试”,
地点编号:“13”,
主菜编号:“8”,
基地:“小麦”,
类型:“食品”
}
我的外星模式如下:

schema“items”做什么
字段:类型,:字符串
字段:名称,:字符串
字段:数据,:地图
属于:创建者,Name.SubName.Creators
属于:地点,名称。子名称。地点
属于:entre,Name.SubName.entre
时间戳()
结束
正如您所看到的,
base
不是一个在exto模式中的字段,我想将
base
转换到
data
字段中,使其成为
map
类型,即:
{“base”:“wheat”}
。我在这里使用某种形式的单表继承

我正在尝试向我的
项目
表中添加一条记录。现在,当我从表中读取时,我将
数据
字段转换为一个嵌入的模式(取决于
类型
),该模式包含我的
字段。我挣扎的地方是让这个字段回到数据库中

我试着使用类似于
exto.Changeset.cast(params[:base],Map.keys(%{data::Map}))
的东西,但很明显,这只是得到了明显不是有效映射的值。此外,为与表示每个
类型的其他嵌入模式关联的所有唯一字段指定这将是一件痛苦的事情

embedded\u one
embedded\u many
不适用于这种情况,因为
data
exto字段表示不同的嵌入模式类型。因此,在本例中,我的问题不是关于嵌入式模式的使用,而是关于在
变更集中挑选特定字段,并将其转换为
映射。我一半的人认为我应该为每种
类型创建一个不同的表,这样我就不用担心这个问题了。

你可以使用:

@必填字段[:名称、类型、创建者id、地点id、主菜id]
@所有_字段[:数据|@必填_字段]
def变更集(结构、参数)do
{allowed,others}=Map.split(参数,@required_字段)
params=Map.put(允许,:数据,其他)
结构
|>施法(参数,@所有字段)
|> # ...
结束

这里需要注意的重要一点是,此示例仅适用于具有原子键的映射,您必须对其进行一些修改才能同时使用字符串键和原子键。您也可以考虑将空映射指定为<代码>的默认值:数据< /代码> .< /p> <强>可以使用:< /强>

@必填字段[:名称、类型、创建者id、地点id、主菜id]
@所有_字段[:数据|@必填_字段]
def变更集(结构、参数)do
{allowed,others}=Map.split(参数,@required_字段)
params=Map.put(允许,:数据,其他)
结构
|>施法(参数,@所有字段)
|> # ...
结束


这里需要注意的重要一点是,此示例仅适用于具有原子键的映射,您必须对其进行一些修改才能同时使用字符串键和原子键。您也可以考虑将空映射指定为<代码>的默认值:数据< /代码> .< /P>谢谢!这就是诀窍。。。现在我必须决定这是否真的是我想做的事情。看起来有点脆,但现在可以了。谢谢!这就是诀窍。。。现在我必须决定这是否真的是我想做的事情。看起来有点脆,但现在可以了。