假設我有兩個模型:Parent和Child。 如果更新了子記錄,是否有一個選項可以自動更新關聯的父記錄時間戳?自動更新父記錄updated_at字段(Elixir-Ecto)
2
A
回答
4
有幾種方法可以做到這一點。其中一人需要外生主(即將外生V2.0),是通過簡單直接更新父:
# Assuming a child_changeset with the parent loaded
child_changset = Ecto.Changeset.put_assoc(child_changeset, :parent, %{updated_at: Ecto.DateTime.utc})
現在,當孩子堅持着,它會自動更改傳播到父。
或者,你可以使用外生V1.1與prepare_changes和update_all傳播的變化:
# Assuming a child_changeset
Ecto.Changeset.prepare_changes child_changeset, fn changeset ->
query = Ecto.assoc(changeset.model, :parent)
changeset.repo.update_all query, set: [updated_at: ^Ecto.DateTime.utc]
changeset
end
在這個例子中,我們使用的是在一個事務中沿着孩子的變化建立一個執行prepare_changes表示父模型的查詢,併爲與查詢匹配的模塊發出update_all更新所有updated_at列。
1
您可以向變更集中添加一個函數來檢查變更以及它們是否有效(這是通過父變更集更新關聯)。
def touch_parent(%{changes: changes, valid: true}=changeset) when map_size(changes) > 0 do
updated_at = DateTime.utc_now() |> DateTime.to_naive()
cast(changeset, %{updated_at: updated_at}, [:updated_at])
end
def touch_parent(changeset), do: changeset
你可以把你的update_changeset
函數模型的結尾。
def update_changeset(%Model{}=model, attrs) do
model
# casting
|> touch_parent()
end
如果你想只是做你會做這樣的事情的具體關聯:
def touch_parent(%{changes: changes, valid: true) when map_size(changes) > 0 do
updated_at = DateTime.utc_now() |> DateTime.to_naive()
changed_fields = Map.keys(changes)
cond do
:association in changed_fields ->
cast(changeset, %{updated_at: updated_at}, [:updated_at])
true -> changeset
end
end
:)
相關問題
- 1. 使用自動遞增字段更新MySQL記錄爲PK
- 2. Mysql:更新最新記錄的字段
- 3. 在Rails記錄更改的updated_at
- 4. 自動更新字段
- 5. CouchDB:自動更新字段
- 6. 更新ADO記錄集計算字段
- 7. Clojure:更新記錄字段的值
- 8. 更改記錄後字段刷新
- 9. MongoDB Java - 更新記錄中的字段
- 10. 如何使自動記錄權限字段儘快更新自己?
- 11. 更新屬性而不更改updated_at字段
- 12. Laravel 5:更新記錄不改變的updated_at領域
- 13. java記錄器動態更改字段
- 14. SQL Server中的自動更新記錄
- 15. 創建和更新來自同一字段的記錄與RoR
- 16. 更新MongoDB記錄會重寫整個記錄還是僅更新字段?
- 17. 融合表自動填充新記錄中的字段
- 18. 如何更新Sequel數據集的updated_at字段?
- 19. Laravel 5.2 - 如何使用UTC時間戳更新「updated_at」字段?
- 20. 更新記錄基於父ID
- 21. Silk4Test動態記錄字段
- 22. Laravel禁用自動「的updated_at」遞增字段
- 23. SQL Server計算字段 - 來自父記錄的數據
- 24. Shopify Customer Metafields和Updated_At字段
- 25. 是否插入/更新/刪除記錄自動更新索引?
- 26. 雙向字段 - 自動更新?
- 27. 用複選框自動更新字段
- 28. 如何自動更新MongoDB字段
- 29. 自動現場更新/計算字段
- 30. 微軟Outlook,自動更新字段