2011-10-26 67 views
0

當父(基)實體尚未保存時,是否可以將文件保存在從屬模型實體中?將文件添加到Rails中未保存的模型實體?

我希望用戶能夠在故事實際保存之前將圖像添加到故事中。所以我的模型是這樣的:

Story (Base Entity) has_many :pictures 
    + Picture (Depedent Entity) belongs_to :story 

在Story控制器中,我有一個單獨的動作叫做add_image。但是,由於實例變量@story似乎並未在請求中保留,因此我無法在此操作中訪問它。

我到目前爲止想做的事情是將@story變量存儲在創建的會話中,以便我可以從那裏檢索它。這會工作嗎?可能會對隨後的請求產生任何意想不到的副作用嗎? (例如,如果我將以前的故事存儲在會話中併爲錯誤的故事添加圖片?)。

回答

0

顯然,這是可以依賴的記錄與主一起節省首先創建:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

參看「未保存的對象和關聯」。您必須使用collection.build來添加從屬記錄。

現在我的問題仍然是如何可靠地堅持跨請求的父母,但我認爲這可能是通過將它存儲在會話中與mongoid生成的ID(唯一的問題是它不可移植跨ORMs , 我認爲)。

這回答了我的問題的一部分。所以我現在不會接受任何答案,一旦我找到了合適的解決方案,我會提供一個更新。

+0

我看到的問題是,如果您有兩個瀏覽器窗口打開連接到同一個會話,則可以使用添加項更新錯誤的窗口(因此可以通過其ID來存儲父項,可能僅在ID前面生成的位置,在Mongoid中,或者其他一些不使用關係數據庫的ORM)。我不希望用戶在會話中結束大量對象,但如果影響很小,也許我會按照這個想法去做。 – mydoghasworms

1

只要想想實施。數據庫中有兩個表,「圖片」表中應該有一行story_id。如果故事沒有保存並且沒有身份證件,應該在那裏?

以另一種方式做。爲故事添加一些布爾標誌,例如finished。保存所有「未完成」的故事,並將標記更改爲「完成」,保存在應用程序中。不要忘記定期刪除舊的「未完成」(遺棄)故事和他們的照片。

+0

謝謝@Petr。我正在使用MongoDB + mongoid。當我創建一個Story的實例時,幸運的是它已經有了一個ID。所以從這方面來說這不是問題。我不想用未完成的故事填充數據庫,所以如果沒有這種可能性,我寧願告訴用戶先保存。我可以在控制檯中創建一個故事,但不保存並添加圖片,所以我猜測它一定是可能的。我也會嘗試使用會話選項,但我只是有點擔心那裏的意外後果。 – mydoghasworms

+0

顯然它是可能的:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html請參閱「未保存的對象和關聯」。你必須使用collection.build。現在我的問題仍然是如何可靠地堅持跨請求的父母,但我認爲這可能是通過將它存儲在會話中由mongoid生成的ID(唯一的問題是它不跨數據庫移植,我認爲) 。 – mydoghasworms

相關問題