【问题标题】:How it works - `belongs_to :user, dependent: :destroy`它是如何工作的 - `belongs_to :user,dependent: :destroy`
【发布时间】:2016-01-06 02:41:20
【问题描述】:

我知道如何工作has_many :posts, dependent: :destroy。如果Userhas_many 发布的内容被销毁,则所有所属的帖子也将被销毁。

但是当Post 模型belongs_to :user, dependent: :destroy 时会发生什么? 我在 Rails 指南中找到了该选项,但我不知道如何使用它。

http://guides.rubyonrails.org/association_basics.html

【问题讨论】:

    标签: ruby-on-rails ruby has-many belongs-to


    【解决方案1】:
    "has_many" 
    

    一位老师“有很多”学生。每个学生只有一个老师,但每个老师都有很多学生。这意味着学生上有一个外键或教师 ID 引用他们所属的老师。

    "belongs_to" 
    

    学生“属于”老师。每个老师都有很多学生,但每个学生只有一个老师。同样,学生的外键引用了他们所属的老师。

    让我们使用这个学生/老师的概念来解决这个问题。

    教师模式

    class Teacher < ActiveRecord::Base
      has_many :students, dependent: :destroy
    end
    

    学生模型

    class Student < ActiveRecord::Base
        belongs_to :teacher 
    end 
    

    假设这些模型

    Teacher.destroy 
    

    将删除实例化的教师以及与该教师关联的所有学生。

    例如

    Teacher.find(345).destroy 
    

    将销毁ID为345的老师的记录,并销毁与该老师关联的所有学生。

    现在问题的核心是,当我的模型看起来像这样时会发生什么?

    教师模式

    class Teacher < ActiveRecord::Base
      has_many :students, dependent: :destroy
    end
    

    学生模型

    class Student < ActiveRecord::Base
        belongs_to :teacher, dependent: :destroy
    end 
    

    如果我打电话

    Student.destroy
    

    这会破坏实例化的学生和该学生的关联教师。但是据我所知(并且根据文档),这不会破坏与该老师有关的任何其他学生,使他们成为“孤儿”。

    这是 Ruby 文档对此的引用 1

    如果设置为 :destroy,则关联对象在该对象被销毁时被销毁。当belongs_to 与另一个类的has_many 关系一起使用时,不应指定此选项,因为可能会留下孤立的记录。

    【讨论】:

      【解决方案2】:

      它实例化所有用户的实例,然后向每个用户发送消息destroy。导致以这种方式销毁的用户的正常销毁生命周期。

      【讨论】:

      • 啊,对不起,我无法理解你的解释。你能给我举个例子吗?
      【解决方案3】:

      我已经尝试设置依赖::destroy 到 belongs_to。示例

      class Post < ActiveRecord::Base
        has_many :comments, dependent: :destroy
      end
      
      class Comment < ActiveRecord::Base
        belongs_to :post, dependent: :destroy
      end
      

      在控制台中,如果评论已被销毁,则帖子将被销毁 但我认为你不应该设置belongs_to +dependent: :destroy 一起

      事实上,以facebook为例,当1条帖子的1条评论被删除时,该帖子不会被删除

      【讨论】:

        猜你喜欢
        • 2011-02-17
        • 1970-01-01
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多