2017-04-14 116 views
0

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

我也看过文档,它似乎是build_assoc/3是更新关系的方式,但它似乎仅限于插入单个关系。从文档,我想我应该做这样的事情:

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

但我从来没有宣布userworklogs,所以它是如何知道设定的工作日志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 
    } 
} 
+0

请问您可以发布相关模式吗? –

+0

@JustinWood好主意,更新。 –

+0

这个新错误应该是无关的。 –

回答

1

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

凤凰模型生成器不会将belongs_to字段添加到投射操作。我通常手动添加它们。

+0

谢谢,这是问题。我曾假设belongs_to字段将在变更集中考虑,但它们不是自动的。手动添加它们可以解决问题。 –

1

在这种情况下,多重关系需要进行设置的,它可能是最好只像这样明确设置它们

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

您也可以将关系放到您的用户和问题模式中,以便您可以更轻松地查询与给定用户或问题相关的工作日志。

+0

谢谢,是的,我想我发现我的问题,那是user_id和issue_id没有被考虑在'Worklog.changeset'函数中。我现在添加了它们,但是出现了一个新的错误。将更新问题 –