在rails 3中,我知道我可以強制刪除依賴對象在belongs_to和has_many關係中使用:dependent =>:delete選項。但是我想知道,什麼是Rails 3的默認值:依賴於has_many和belongs_to
是什麼,如果我不指定默認行爲:依賴=> ...
乾杯, 哈喬
在rails 3中,我知道我可以強制刪除依賴對象在belongs_to和has_many關係中使用:dependent =>:delete選項。但是我想知道,什麼是Rails 3的默認值:依賴於has_many和belongs_to
是什麼,如果我不指定默認行爲:依賴=> ...
乾杯, 哈喬
雖然沒有在documentation中所說,默認行爲是對關聯對象不做任何事情。也就是說,刪除或銷燬對象不會刪除或銷燬它所屬或擁有的許多對象。
感謝您指出:)我期望rails會嘗試使用數據庫查詢加載相關對象,如果它們的ID字段未被正確無效。這意味着,浪費CPU和DB時間來搜索不存在的記錄。所以我想知道爲什麼Rails在默認情況下沒有對它做任何事情...... – fxtentacle
has_many使用:nullify策略,它將設置外部爲空。對於has_many:通過它將使用delete_all。
對於has_many,destroy將始終調用要刪除的 記錄的銷燬方法,以便執行回調。但刪除將根據 指定的策略執行刪除操作:依賴選項,或者如果沒有:依賴選項,則會按照默認策略 執行刪除操作。默認策略是:nullify(將 外鍵設置爲零),但has_many:through除外,其中默認的 策略爲delete_all(刪除連接記錄,不運行其 回調)。
- ActiveRecord::Associations::ClassMethods
belongs_to的不知道到底是什麼,而不是能夠找到的文檔任何東西。我會盡力做一些挖掘並更新答案。
你確定這仍然是這樣嗎?我剛剛經歷了默認行爲不是爲了取消外鍵。我必須明確設置'dependent::nullify'來使其無效。我使用的是Ruby 2.0.0和Rails 4.0.0。 – Magne
在Rails 3中,缺省:dependent
值是:nullify
,它將外鍵設置爲零。
默認策略是
:nullify
常規has_many
。此外,如果源反射是belongs_to
,則這僅適用於所有情況。
來源:http://guides.rubyonrails.org/3_1_release_notes.html#active-record
這仍然是在Rails中4
然而
delete
和delete_all
的情況下,根據由:dependent
選項,或者指定的策略要麼做不刪除:dependent
選項給出,那麼它將遵循默認策略。默認策略是:nullify
(將外鍵設置爲nil
),但has_many :through
除外,默認策略爲delete_all
(刪除連接記錄,不運行其回調)。
不幸的是,這是不正確的。引用的文檔是指在has_many關聯(如'blog.posts.delete_all')上調用delete/delete_all。在模型上調用'blog.destroy'而不是在關係上 - 除非has_many關係指定了'dependent'行爲,否則對相關模型根本不會做任何事情。 (默認是留下懸掛引用) – gmcnaughton
如果不指定這一點,你會被遺棄的孩子哭着要父母結束了。這不是什麼大不了的事情,但它會讓數據庫充滿(無用的)數據 – apneadiving