Rails 一个有点不明白的问题 (删除对象), 求指点

hexogen · 2016年10月11日 · 最后由 hexogen 回复于 2016年10月11日 · 1545 次阅读

有一段代码是删除 Testtask 和 Subtask 这两个对象的关系是:

Testtask has_many subtasks

我是这样写的:

ActiveRecord::Base.transaction do
      Testtask.find(params[:id]).subtasks.each do |st|
         st.destroy!
      end
      Testtask.find(params[:id]).destroy!  # ← here 
end

问题来了:执行到

Testtask.find(params[:id]).destroy!)  # ← here 

的时候报错,提示我按照这个 id 找不到这个 Testask ... 可是前面的 find 是成功了的...

无奈,现在的处理方法是这样的:

ActiveRecord::Base.transaction do
      this_tt = Testtask.find(params[:id])
      this_tt.subtasks.each do |st|
        st.destroy!
      end
      this_tt.destroy!
end

这样就可以了,谁能告诉我这个是什么情况...好奇怪

建立自动销毁的关联你就不用 each 了

class Testtask
  has_many :subtasks, dependent: :destroy
end

Testtask.find(params[:id]).destroy! #建立以上关系后,使用这一句话就等价于以下你的代码了

Testtask.find(params[:id]).subtasks.each do |st|
    st.destroy!
end

Testtask.find(params[:id]).destroy!  # ← here 

补充一下 我知道应该在 model 里面加上 dependent: :destroy 主要是我在 mysql 上直接删除 testtask 报错 外键约束删除失败

#1 楼 @breeze 我之前确实这么做的 但是很不巧 在 mysql 上因为外键约束删除失败 然后就尝试着自己做,发现了这个区别,很好奇是什么原因引起的。

关于外键约束的问题 准备在 add_refference 的时候加上 on_delete: :cascade 来试试看

需要 登录 后方可回复, 如果你还没有账号请 注册新账号