Ecto模型更新多个关系

时间:2017-04-14 00:13:15

标签: elixir phoenix-framework ecto

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

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

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

但我从未在worklogs上声明user,那么如何在工作日志中设置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
  }
}

2 个答案:

答案 0 :(得分:1)

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

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

您也可以将关系放在用户身上并发布架构,这样您就可以更轻松地查询与给定用户或问题相关的工作日志。

答案 1 :(得分:1)

需要查看您的变更集以提供具体答案。但是,我怀疑您的变更集中的user_id来电中遗失了issue_idcast。如果字段未在强制转换列表中列出,则Ecto不会向更改添加字段。

凤凰模型生成器不会将belongs_to字段添加到强制转换操作中。我通常会手动添加它们。