【问题标题】:Ecto model update multiple relationshipsEcto 模型更新多个关系
【发布时间】:2017-04-14 10:03:38
【问题描述】:

我正在尝试在表 worklogs 中插入一个 Ecto 模型,该表有两个关系 user_id 和 issue_id。我发现,当我尝试为具有这两个字段的有效整数的工作日志创建变更集时,它们不包含在变更集中,并且在生成的 worklog 和 API 响应中为空。我已确保存在 user 和 issue 以及我使用 worklog 插入的主键。

我还查看了文档,似乎build_assoc/3 是更新关系的方式,但它似乎仅限于插入单个关系。从文档中,我认为我应该这样做:

user = #get the user
worklog = Ecto.build_assoc(user, :worklogs, worklog_params)

但是我从来没有在user上声明过worklogs,那么它怎么知道在工作日志上设置user_id呢?另外,我如何随后添加issue_id?

架构:

  schema "worklogs" do
    field :start_time, Ecto.DateTime
    field :end_time, Ecto.DateTime
    belongs_to :issue, MyApi.Issue
    belongs_to :user, MyApi.User

    timestamps()
  end

  schema "users" do
    field :name, :string

    timestamps()
  end

  schema "issues" do
    field :title, :string
    field :status, :string
    field :description, :string
    field :estimate, :float

    timestamps()
  end

控制器逻辑:

def create(conn, %{"worklog" => worklog_params}) do
    changeset = Worklog.changeset(%Worklog{}, worklog_params)

    IO.inspect changeset #user_id and issue_id are not present

    case Repo.insert(changeset) do
      {:ok, worklog} ->
        conn
        |> put_status(:created)
        |> put_resp_header("location", worklog_path(conn, :show, worklog))
        |> render("show.json", worklog: worklog)
      {:error, changeset} ->
        conn
        |> put_status(:unprocessable_entity)
        |> render(MyApi.ChangesetView, "error.json", changeset: changeset)
    end
  end

POST 请求:

{
  "worklog": {
    "start_time": "2017-04-08 02:20:00",
    "end_time": "2017-04-08 02:30:00",
    "issue_id": 1,
    "user_id": 1
  }
}

【问题讨论】:

  • 能否请您发布相关架构?
  • @JustinWood 好主意,已更新。
  • 那个新错误应该是无关的。

标签: elixir phoenix-framework ecto


【解决方案1】:

需要查看您的变更集以提供具体答案。但是,我怀疑您在变更集中的cast 调用中缺少user_id 和issue_id。如果字段未在演员表中列出,Ecto 不会将字段添加到更改中。

phoenix 模型生成器不会在 cast 操作中添加 belongs_to 字段。我通常手动添加它们。

【讨论】:

  • 谢谢,这就是问题所在。我曾假设将在变更集中考虑 belongs_to 字段,但它们不是自动的。手动添加它们可以解决问题。
【解决方案2】:

在这种需要设置多个关系的情况下,最好像这样明确设置它们

%Worklog{user_id: user.id, issue_id: issue.id}
|> Worklog.changset(worklog_params)
|> Repo.insert()

您还可以从将关系置于您的用户和问题架构中受益,以便您能够更轻松地查询与给定用户或问题相关的工作日志。

【讨论】:

  • 谢谢,是的,我想我发现了我的问题,即Worklog.changeset 函数中没有考虑 user_id 和 issue_id。我现在添加了它们,但出现了一个新错误。将更新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多