2017-04-14 63 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'函數中。我現在添加了它們,但是出現了一個新的錯誤。將更新問題 –