elixir - ecto 变更集为现有添加关联
问题描述
早上好!我已经到了挣扎的时刻。总而言之,我正在尝试创建一个模式/模型,该模式/模型具有关联的模式/模型已经存在的关联。我发现的每个示例看起来都更像 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
]
我想与之关联的预先存在的模式:
schema "payors" do
field :name, :string, null: :false
field :polling_url, :string, null: :false
timestamps()
end
def changeset(model, params \\ %{}) do
model
|> cast(params, all_params())
|> validate_required(required())
end
这是我尝试设置关联的代码:
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
(请注意,测试函数的第二个参数中的付款人是已经加载的模式/模型结构)
需要明确的是,我传入的参数如下所示:
%{
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"
}
我遇到的情况是,如果付款人已经存在,我的测试真的很不开心。尝试运行该测试时出现此错误:
** (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)
完全披露,我在谷歌上搜索了很多,但我能找到的例子是在插入 payor_procedure_mappings 时创建或构建付款人模式。
我觉得我在杂草中消失了。我很想得到一些关于去哪里看的指示,这是我所问问题的好例子。
提前感谢您的帮助!
解决方案
您可以尝试以下方法:
# 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_procedure_mappings
您正在创建的记录与现有payor
记录相关联,我相信您只需要设置适当的 id。
推荐阅读
- vb.net - 使用阶乘查找组合
- ios - 在不同的滑动视图之间传递 UIPageViewController 中的数据
- amazon-web-services - AWS S3 存储桶清理但保存一定数量的文件夹
- android - Android Studio (3.2.1) Instant Run 不适用于 Jacoco 0.8.2?
- c# - 在屏幕上显示 VideoFrame
- informix - 如何在 Informix 中使用 group by?
- java - 如何在 Intellij 中阻止长时间运行的 Java 程序
- python - Otsu 阈值发现返回的值太高
- python-2.7 - Python SQLite3 - fetch 不适用于我的代码
- c# - 在多次迭代中从 QB 文件中检索数据