簡體   English   中英

在ActiveRecord / Rails中調用destroy時的默認依賴動作

[英]Default dependent action when calling destroy in ActiveRecord / Rails

在ActiveRecord中的模型上調用destroy時,我已經讀過它能夠銷毀所有關聯的記錄,並且該功能似乎是在建立關聯時通過使用dependent選項來設置的。

我想知道的是-如果設置該選項會怎樣?

例如,在下面的代碼中,我的說法是否正確:

  1. 訂戶不會受到影響
  2. 用戶不會受到影響
  3. 評論將被銷毀嗎? (進而將它們標記為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM