10

在rails 3中,我知道我可以強制刪除依賴對象在belongs_to和has_many關係中使用:dependent =>:delete選項。但是我想知道,什麼是Rails 3的默認值:依賴於has_many和belongs_to

是什麼,如果我不指定默認行爲:依賴=> ...

乾杯, 哈喬

+1

如果不指定這一點,你會被遺棄的孩子哭着要父母結束了。這不是什麼大不了的事情,但它會讓數據庫充滿(無用的)數據 – apneadiving

回答

16

雖然沒有在documentation中所說,默認行爲是對關聯對象不做任何事情。也就是說,刪除或銷燬對象不會刪除或銷燬它所屬或擁有的許多對象。

+0

感謝您指出:)我期望rails會嘗試使用數據庫查詢加載相關對象,如果它們的ID字段未被正確無效。這意味着,浪費CPU和DB時間來搜索不存在的記錄。所以我想知道爲什麼Rails在默認情況下沒有對它做任何事情...... – fxtentacle

6

has_many使用:nullify策略,它將設置外部爲空。對於has_many:通過它將使用delete_all。

對於has_many,destroy將始終調用要刪除的 記錄的銷燬方法,以便執行回調。但刪除將根據 指定的策略執行刪除操作:依賴選項,或者如果沒有:依賴選項,則會按照默認策略 執行刪除操作。默認策略是:nullify(將 外鍵設置爲零),但has_many:through除外,其中默認的 策略爲delete_all(刪除連接記錄,不運行其 回調)。

- ActiveRecord::Associations::ClassMethods

belongs_to的不知道到底是什麼,而不是能夠找到的文檔任何東西。我會盡力做一些挖掘並更新答案。

+6

你確定這仍然是這樣嗎?我剛剛經歷了默認行爲不是爲了取消外鍵。我必須明確設置'dependent::nullify'來使其無效。我使用的是Ruby 2.0.0和Rails 4.0.0。 – Magne

3

在Rails 3中,缺省:dependent值是:nullify,它將外鍵設置爲零。

默認策略是:nullify常規has_many。此外,如果源反射是belongs_to,則這僅適用於所有情況。

來源:http://guides.rubyonrails.org/3_1_release_notes.html#active-record

這仍然是在Rails中4

然而deletedelete_all的情況下,根據由:dependent選項,或者指定的策略要麼做不刪除:dependent選項給出,那麼它將遵循默認策略。默認策略是:nullify(將外鍵設置爲nil),但has_many :through除外,默認策略爲delete_all(刪除連接記錄,不運行其回調)。

來源:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Delete+or+destroy%3F

也看到源代碼文檔:https://github.com/rails/rails/blob/b5a8fd7bb4a6fa4b67d4eabae4cea2cb1834d8d9/activerecord/lib/active_record/associations/collection_proxy.rb#L369

+0

不幸的是,這是不正確的。引用的文檔是指在has_many關聯(如'blog.posts.delete_all')上調用delete/delete_all。在模型上調用'blog.destroy'而不是在關係上 - 除非has_many關係指定了'dependent'行爲,否則對相關模型根本不會做任何事情。 (默認是留下懸掛引用) – gmcnaughton

相關問題