【发布时间】:2022-11-05 12:13:18
【问题描述】:
我正在尝试更新 select2 多个但遇到挑战
这是我的架构
defmodule Recon.Accounts.OriginatorMapping do
use Ecto.Schema
use Endon
import Ecto.Changeset
@timestamps_opts [autogenerate: {Recon.Reconmaster.Master.Localtime, :autogenerate, []}]
schema "tbl_originator_mapping" do
# field :org_id, :id
# field :participants_id, :id
field :status, :string, default: "D"
belongs_to :originator, Recon.Accounts.OriginatorIds, foreign_key: :org_id, type: :id
belongs_to :participant, Recon.Accounts.Participant, foreign_key: :participants_id, type: :id
belongs_to :maker, Recon.Accounts.OriginatorIds, foreign_key: :maker_id, type: :id
belongs_to :checker, Recon.Accounts.Participant, foreign_key: :checker_id, type: :id
timestamps()
end
@doc false
def changeset(originator_mapping, attrs) do
originator_mapping
|> cast(attrs, [:org_id, :participants_id, :maker_id, :checker_id, :status])
|> validate_required([])
end
end
这是我在控制器中的创建功能:
def update_originator_mapping(conn, params) do
activity = "Modified Originator Mapping for "
user = conn.assigns.user
params["participants_id"]
|> Enum.with_index()
|> Enum.reduce(Ecto.Multi.new(), fn {_col, index}, multi ->
column_params = %{
maker_id: conn.assigns.user.id,
checker_id: conn.assigns.user.id,
participants_id: Enum.at(params["participants_id"], index),
org_id: params["org_id"]
}
participant_id = Enum.at(params["participants_id"], index)
column =
if byte_size(participant_id) > 0, do: OriginatorMapping.find_by(org_id: params["org_id"], participants_id: participant_id), else: %OriginatorMapping{}
changeset = OriginatorMapping.changeset(column, column_params)
Ecto.Multi.insert_or_update(multi, {:column, index}, changeset)
end)
|> Ecto.Multi.insert(:user_log, %UserLog{user_id: user.id, activity: activity})
|> Repo.transaction()
|> case do
{:ok, %{user_log: _user_log}} ->
json(conn, %{data: "Operation Successfull!"})
{:error, _failed_operation, failed_value, _changes_so_far} ->
reason = traverse_errors(failed_value.errors) |> List.first()
json(conn, %{error: reason})
end
end
日志中的错误是:
[错误] #PID<0.1831.0> running ReconWeb.Endpoint (connection #PID<0.1671.0>, stream id 37) 终止 服务器:本地主机:4000(http) 请求:POST /update/originator/mapping **(退出)引发异常: ** (FunctionClauseError) Ecto.Changeset.cast/4 中没有函数子句匹配 (ecto 3.8.3) lib/ecto/changeset.ex:480: Ecto.Changeset.cast(nil, %{checker_id: 1, maker_id: 1, org_id: "1",参与者_id: "3"}, [:org_id , :participants_id, :maker_id, :checker_id, :status], []) (侦察 0.1.0) lib/recon/accounts/originator_mapping.ex:24: Recon.Accounts.OriginatorMapping.changeset/2 (侦察 0.1.0)lib/recon_web/controllers/originator_ids_controller.ex:353:ReconWeb.OriginatorIdsController.update_originator_mapping/2 中的匿名 fn/4 (elixir 1.13.3) lib/enum.ex:2396: Enum."-reduce/3-lists^foldl/2-0-"/3 (侦察 0.1.0) lib/recon_web/controllers/originator_ids_controller.ex:340: ReconWeb.OriginatorIdsController.update_originator_mapping/2 (侦察 0.1.0) lib/recon_web/controllers/originator_ids_controller.ex:1: ReconWeb.OriginatorIdsController.action/2 (侦察 0.1.0) lib/recon_web/controllers/originator_ids_controller.ex:1: ReconWeb.OriginatorIdsController.phoenix_controller_pipeline/2 (phoenix 1.5.13) lib/phoenix/router.ex:352: Phoenix.Router。称呼/2 (recon 0.1.0) lib/recon_web/endpoint.ex:1: ReconWeb.Endpoint.plug_builder_call/2 (recon 0.1.0) lib/plug/debugger.ex:136: ReconWeb.Endpoint."call (overridable 3)"/2 (recon 0.1.0) lib/recon_web/endpoint.ex:1: ReconWeb.Endpoint.call/2 (phoenix 1.5.13) lib/phoenix/endpoint/cowboy2_handler.ex:65: Phoenix.Endpoint.Cowboy2Handler.init/4 (cowboy 2.9.0) d:/Work/Recon/recon/deps/cowboy/src/cowboy_handler.erl:37: :cowboy_handler.execute/2 (cowboy 2.9.0) d:/Work/Recon/recon/deps/cowboy/src/cowboy_stream_h.erl:306: :cowboy_stream_h.execute/3 (cowboy 2.9.0) d:/Work/Recon/recon/deps/cowboy/src/cowboy_stream_h.erl:295: :cowboy_stream_h.request_process/3 (stdlib 3.14.1) proc_lib.erl:226: :proc_lib.init_p_do_apply/3
【问题讨论】:
-
请分享
lib/recon/accounts/originator_mapping.ex:24和周围。 -
我会根据
column是nil的错误猜测,因为OriginatorMapping.find_by(org_id: params["org_id"], participants_id: participant_id)返回nil?
标签: elixir phoenix-framework ecto