在ActiveRecord中的模型上调用destroy
时,我已经读过它能够销毁所有相关记录,并且在设置关联时似乎使用dependent
选项设置了该功能
我想知道的是 - 如果不设置选项会怎样?
例如,在下面的代码中,我说的是正确的:
dependent: destroy
标记的任何关联也将遵循相同的过程)class StackOverflowQuestion < ActiveRecord::Base
belongs_to :user
has_many :subscribers
has_many :comments, dependent: :destroy
end
我的最终目标是能够拥有一个模型,该模型将销毁某些相关记录,但不一定是所有这些记录,因为销毁所有关联将意味着其他记录引用的数据会开始被消灭(例如在这个例子中,如果他们的问题被删除,我不希望删除用户。)
答案 0 :(得分:1)
您的描述是正确的。但是你应该知道subscribers
记录将成为孤儿。如果它们设置为had_many
关系,则在显示时,每个subscriber
记录都包含一个外键,该外键是StackOverflowQuestion
记录的ID,在您之后将不再存在摧毁它。所以它会指向无效的记录。
答案 1 :(得分:1)
订阅者不会受到影响
这取决于您使用外键定义架构的方式。这里有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
不会受到影响。
评论会被破坏吗? (反过来他们也有任何关联 已标记为依赖:销毁也将遵循相同 处理)
是的,这就是rails的工作原理
<强>摘要强> 你可以这样重新定义:
class StackOverflowQuestion < ActiveRecord::Base
belongs_to :user
has_many :subscribers, dependent: :nullify
has_many :comments, dependent: :destroy
end
因此,当您销毁subscribers
时,您的NIL
外键将被设置为StackOverflowQuestion
,并且没有任何非零的外键并且无效!