我试图在表格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)
但我从未在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
}
}
答案 0 :(得分:1)
在需要设置多个关系的情况下,最好像这样明确地设置它们
%Worklog{user_id: user.id, issue_id: issue.id}
|> Worklog.changset(worklog_params)
|> Repo.insert()
您也可以将关系放在用户身上并发布架构,这样您就可以更轻松地查询与给定用户或问题相关的工作日志。
答案 1 :(得分:1)
需要查看您的变更集以提供具体答案。但是,我怀疑您的变更集中的user_id
来电中遗失了issue_id
和cast
。如果字段未在强制转换列表中列出,则Ecto不会向更改添加字段。
凤凰模型生成器不会将belongs_to字段添加到强制转换操作中。我通常会手动添加它们。