Elixir 现有系统的外部变更集添加关联

Elixir 现有系统的外部变更集添加关联,elixir,associations,ecto,Elixir,Associations,Ecto,早上好!我已经到了挣扎的时刻。总而言之,我试图创建一个模式/模型,该模式/模型在关联的模式/模型已经存在的地方具有关联。我发现的每个示例都更像Rails嵌套属性。以下是我的各种代码: 具有以下关联的架构(&其变更集函数): schema "payor_procedure_mappings" do belongs_to :payor, Payor belongs_to :procedure, Procedure field :payor_procedure_name, :string

早上好!我已经到了挣扎的时刻。总而言之,我试图创建一个模式/模型,该模式/模型在关联的模式/模型已经存在的地方具有关联。我发现的每个示例都更像Rails嵌套属性。以下是我的各种代码:

具有以下关联的架构(&其变更集函数):

schema "payor_procedure_mappings" do
  belongs_to :payor, Payor
  belongs_to :procedure, Procedure
  field :payor_procedure_name, :string
  field :payor_procedure_id, :string

  timestamps()
end

def changeset(model, params \\ %{}) do 
  model
  |> cast(params, all_params())
  |> validate_required(required())
  |> cast_assoc(:payor, params[:payor])  # <--- LINE 50 from stacktrace
end

defp required do
  :payor_procedure_name,
  :payor_procedure_id
]
下面是我试图设置关联的代码:

test "valid if all required params are present", %{procedure: procedure, payor: payor} do 
  params = %{
    payor: payor,
    payor_procedure_name: "That one thing we do to patients",
    payor_procedure_id: "2342"
  }

changeset = 
  %PayorProcedureMapping{}
  |> PayorProcedureMapping.changeset(params)   # THIS IS LINE 28 from stacktrace

  assert changeset.valid?
end
(请注意,test函数的第二个参数中的付款人是已加载的架构/模型结构)

要明确的是,传入的参数如下所示:

%{
  payor: %ReimbursementMonitor.Schemas.Payor{
    __meta__: #Ecto.Schema.Metadata<:loaded, "payors">,
    id: 12,
    inserted_at: ~N[2020-02-15 16:30:16],
    name: "test_name",
    polling_url: "www.example.com",
    updated_at: ~N[2020-02-15 16:30:16]
  },
  payor_procedure_id: "2342",
  payor_procedure_name: "That one thing we do to patients"
}
%{
付款人:%RequirementMonitor.Schemas.payor{
__meta:#exto.Schema.Metadata,
id:12,
插入地址:~N[2020-02-15 16:30:16],
名称:“测试名称”,
轮询url:“www.example.com”,
更新地址:~N[2020-02-15 16:30:16]
},
付款人程序id:“2342”,
付款人程序名称:“我们对患者所做的一件事”
}
我遇到的情况是,如果付款人已经存在,我的测试真的很不愉快。我在尝试运行该测试时遇到此错误:

** (FunctionClauseError) no function clause matching in Keyword.get_lazy/3

 The following arguments were given to Keyword.get_lazy/3:

     # 1
     nil

     # 2
     :with

     # 3
     #Function<5.89690842/0 in Ecto.Changeset.cast_relation/4>

 Attempted function clauses (showing 1 out of 1):

def get_lazy(keywords, key, fun) when is_list(keywords) and is_atom(key) and is_function(fun, 0)
  code: |> PayorProcedureMapping.changeset(params)
  stacktrace:
    (elixir) lib/keyword.ex:223: Keyword.get_lazy/3
    (ecto) lib/ecto/changeset.ex:778: Ecto.Changeset.cast_relation/4
    (reimbursement_monitor) lib/reimbursement_monitor/schemas/payor_procedure_mapping.ex:50: ReimbursementMonitor.Schemas.PayorProcedureMapping.changeset/2
    test/schemas/payor_procedure_mapping_test.exs:28: (test)
**(FunctionClauseError)关键字中没有匹配的函数子句。get\u lazy/3
为关键字.get_lazy/3提供了以下参数:
# 1
无
# 2
:与
# 3
#作用
尝试的函数子句(显示1/1):
当is_列表(关键字)、is_原子(关键字)和is_函数(乐趣,0)时,def get_lazy(关键字、键、乐趣)
代码:|>PayorProcedureMapping.changeset(参数)
堆栈跟踪:
(elixir)lib/keyword.ex:223:keyword.get_/3
(exto)lib/exto/changeset.ex:778:exto.changeset.cast\u关系/4
(报销监控)lib/repensation\u monitor/schemas/payor\u procedure\u mapping.ex:50:repensementmonitor.schemas.PayorProcedureMapping.changeset/2
test/schemas/payor\u procedure\u mapping\u test.exs:28:(test)
完全公开,我在谷歌搜索了很多,但我能找到的例子是在插入付款人程序映射时创建或构建付款人模式

我觉得我好像在野草里。我很想得到一些去哪里的建议,看看我想问的好例子


提前谢谢你的帮助

您可以尝试以下方法吗:

# the params that you pass in
%{
  payor_id: 12,
  payor_procedure_id: "2342",
  payor_procedure_name: "That one thing we do to patients"
}

# the changeset function for payor_procedure_mappings
def changeset(model, params \\ %{}) do 
  model
  |> cast(params, all_params())
  |> validate_required(required())
end

我认为
cast_assoc
的目的是创建新的关联记录,这就是为什么您只找到了这样做的示例。由于您只想将正在创建的
payor\u procedure\u映射
记录与现有的
payor
记录相关联,因此我相信您只需要设置适当的id。

是否可以尝试以下操作:

# the params that you pass in
%{
  payor_id: 12,
  payor_procedure_id: "2342",
  payor_procedure_name: "That one thing we do to patients"
}

# the changeset function for payor_procedure_mappings
def changeset(model, params \\ %{}) do 
  model
  |> cast(params, all_params())
  |> validate_required(required())
end

我认为
cast_assoc
的目的是创建新的关联记录,这就是为什么您只找到了这样做的示例。由于您只想将您正在创建的
payor\u procedure\u映射
记录与现有的
payor
记录相关联,因此我相信您只需要设置适当的id。

,正如

cast_assoc/3
可匹配从数据库中提取的记录(预加载),并将其与外部源提供的参数进行比较

也就是说,上面链接中的示例正是您所需要的:

- |> cast_assoc(:payor, params[:payor])
+ |> cast_assoc(:payor, with: &Payor.changeset/2)

错误消息还提示可能存在
,其中应包含:
关键字。

,如

cast_assoc/3
可匹配从数据库中提取的记录(预加载),并将其与外部源提供的参数进行比较

也就是说,上面链接中的示例正是您所需要的:

- |> cast_assoc(:payor, params[:payor])
+ |> cast_assoc(:payor, with: &Payor.changeset/2)
错误消息还提示可能存在以下情况:关键字