在ActiveRecord / Rails中调用destroy时的默认相关操作

时间:2016-02-23 16:18:31

标签: ruby-on-rails ruby activerecord

在ActiveRecord中的模型上调用destroy时,我已经读过它能够销毁所有相关记录,并且在设置关联时似乎使用dependent选项设置了该功能

我想知道的是 - 如果设置选项会怎样?

例如,在下面的代码中,我说的是正确的:

  1. 订阅者不会受到影响
  2. 用户不会受到影响
  3. 评论会被销毁吗? (反过来,他们用dependent: destroy标记的任何关联也将遵循相同的过程)
  4. class StackOverflowQuestion < ActiveRecord::Base
      belongs_to :user
      has_many :subscribers
      has_many :comments, dependent: :destroy
    end
    

    我的最终目标是能够拥有一个模型,该模型将销毁某些相关记录,但不一定是所有这些记录,因为销毁所有关联将意味着其他记录引用的数据会开始被消灭(例如在这个例子中,如果他们的问题被删除,我不希望删除用户。)

2 个答案:

答案 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,并且没有任何非零的外键并且无效!