[英]Default dependent action when calling destroy in ActiveRecord / Rails
在ActiveRecord中的模型上調用destroy
時,我已經讀過它能夠銷毀所有關聯的記錄,並且該功能似乎是在建立關聯時通過使用dependent
選項來設置的。
我想知道的是-如果不設置該選項會怎樣?
例如,在下面的代碼中,我的說法是否正確:
dependent: destroy
任何關聯dependent: destroy
也將遵循相同的過程) class StackOverflowQuestion < ActiveRecord::Base
belongs_to :user
has_many :subscribers
has_many :comments, dependent: :destroy
end
我的最終目標是能夠建立一個模型,該模型將銷毀一些關聯的記錄,但不一定要全部銷毀,因為銷毀所有關聯將意味着其他記錄所引用的數據將開始被清除(例如在此示例中,如果用戶的問題已刪除,我不希望將其刪除)。
您的描述是正確的。 但是您應該知道, subscribers
記錄將被孤立。 如所示,如果它們使用had_many
關系設置,則每個subscriber
記錄都包含一個外鍵,該外鍵是StackOverflowQuestion
記錄的ID,銷毀后該記錄將不再存在。 因此它將指向無效的記錄。
訂戶不會受到影響
這取決於您如何使用外鍵定義架構。 這里有2種情況:
情況1 :您可以這樣定義架構:
create_table :subscribers do |t|
t.integer :stack_overflow_question_id
# other fields
end
add_index :subscribers, :stack_overflow_question_id
add_foreign_key :subscribers, :stack_overflow_question, column: :stack_overflow_question_id
這意味着您為stack_overflow_question_id
設置了外鍵約束,因此,當您刪除StackOverflowQuestion
,如果有任何Subscriber
具有引用該StackOverflowQuestion
的外鍵,則rails會給您一個錯誤 ,這是有道理的,因為您要引用記錄到刪除的記錄!
情況2 :與Case 1
相似,但沒有外鍵約束
Rails不會給您任何錯誤 ,但您會發現數據有問題,有些記錄引用了已刪除的記錄,應避免這種情況
用戶不會受到影響
這是有道理的,因為這是belongs_to
關系, user
不會受到影響。
評論將被銷毀嗎? (進而將它們標記為dependency的任何關聯:destroy也將遵循相同的過程)
是的,這就是Rails的工作方式
總結您可以這樣重新定義:
class StackOverflowQuestion < ActiveRecord::Base
belongs_to :user
has_many :subscribers, dependent: :nullify
has_many :comments, dependent: :destroy
end
因此,當您銷毀StackOverflowQuestion
時, subscribers
的外鍵將設置為NIL
,並且沒有任何外鍵都不為nil且無效!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.