2013-01-07 33 views
2

我正在尋找正確的現在,解決當前問題的最佳辦法:我有兩個型號,產品照片。照片通過has_many與產品關聯。 當用戶創建新產品時,在實際產品保存到數據庫之前,她還可以使用嵌套表單(carrierwave,jquery)添加照片。由於該產品尚不存在,因此我正在尋找將我的照片以正確關聯保存到數據庫的最佳方式。最佳實踐:臨時記錄用的has_many協會

一些方法來我的腦海裏:

1)我的產品保存到數據庫中,當用戶點擊「新產品」向右走,用正確的ID,之後,如果用戶點擊再次刪除「取消」。通過這種方式,我必須對我的驗證進行一些調整,然後進行一些客戶端驗證。 如果用戶在創建產品期間關閉瀏覽器窗口,可能會出現問題 - 產品將保留在數據庫中。

2)我把它保存到數據庫和國旗不知何故,有一個奇怪的ID或is_temp字段或類似的東西..這樣,每次我可以清理數據庫中的用戶登錄「着性「馬上刪除東西(和所有相關照片)。

3)在內存中創建一個臨時ID,並且不保存該產品。我可以將照片保存爲與此臨時ID相關聯,並且當用戶點擊最終保存時,我將product_id更改爲新的真實產品ID

對我而言,至今爲止,解決方案2看起來是最好,最乾淨的方式它與Ryan Bates的客座記錄Railscast類似,但也許我在這裏錯過了一些東西,而且有一種更簡單的方法。 任何其他解決方案,高度讚賞。

非常感謝!

+1

我通常提供一個非常簡單的形式,只有一些非常特定的領域。例如,對於產品,您有一個項目名稱和一個項目編號。我將使用一個彈出窗口(引導程序或jqueryui對話框),允許用戶將產品添加到類別中,而不必通過僅提供項目編號和項目名稱而離開該頁面。然後,如果他們需要添加照片,他們會進入產品編輯表單,在其中他們可以執行其他任何操作。 –

+1

就您的三種解決方案而言,我不喜歡選項2,因爲它會在數據庫中留下記錄,直到下次用戶登錄時(可能是幾個月甚至從來不會),即使您在註銷,你認爲他們註銷了什麼?會話超時?用戶點擊「註銷」?我會選擇#1或#3,更傾向於#1 –

+0

謝謝你,我的確和#1一起去了。我正在考慮用#2的方式刪除舊記錄,並將其作爲cron,這與Ryan Bates的Railscast類似。但現在它很好,大家都很開心:-) 再次感謝! –

回答

2

使用#1因爲它更健壯。特別是,它對API更有效。

這會讓你養成模型的習慣,以便能夠以獨立的方式保存和修改模型。例如,用戶可能真的想要沒有照片的產品。

我的真實世界的應用程序完全是這樣的設置。當用戶嘗試使用未正確上傳的照片創建產品時,產品仍然保存正確,驗證正確等​​。

此外,應用程序還有一個調用API創建產品,然後再打電話添加照片。 API客戶端能夠獨立於所有相關照片創建產品非常有用。

避免#2,因爲它會讓產品滯留在數據庫中。更糟的是,該產品尚未經過驗證。這往往會導致應用程序的其他方面出現問題,例如報告,除非您強制每個報告查詢過濾出擱淺的記錄。

僅當您希望在交易中和/或需要最快速度的情況下才考慮#3。首先在內存中執行它確實有助於確保事務具有所需的所有部分,並且確實節省了訪問數據庫的時間。

+0

嘿,對於遲到的回覆感到抱歉,在此期間我也遇到了其他一些問題。 非常感謝您的回答,我遵循您的建議並採用了這種方式。我甚至更進了一步,只是讓它們都是草稿,所以當用戶想要創建產品時,它會立即在數據庫中進行設置,直到她明確刪除它爲止。稍後我可能會添加一些Ajax魔術來在用戶正在編輯時保存進度。到目前爲止,對我來說似乎非常防彈,並且它對我的照片上傳器非常有用。 :-) 再次感謝! –