首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >依赖销毁不会销毁依赖关系

依赖销毁不会销毁依赖关系
EN

Stack Overflow用户
提问于 2013-12-04 05:07:50
回答 1查看 1.8K关注 0票数 1

我有以下模型:

代码语言:javascript
复制
class Article < ActiveRecord::Base
    has_many :comments, :as => :subject, :dependent => :destroy
    has_many :deleted_comments, :as => :subject, :dependent => :destroy
end

class DeletedComment < ActiveRecord::Base
    belongs_to :subject, :polymorphic => true
end

class Comment < ActiveRecord::Base
    belongs_to :subject, :polymorphic => true
    before_destroy :create_deleted_comment

    def create_deleted_comment
        DeletedComment.create!(....)
    end
end

在我的数据库中,有相当多的DeletedComment对象的主题是nil。DeletedComment (和注释)模型存储:article_id,对于主题为nil的模型,Article.find(deleted_comment.article_id)将引发ActiveRecord::RecordNotFound错误。

是否存在:dependent => :destroy会销毁父记录但保持依赖关系不变的情况?

有没有可能在某些情况下,当我删除一篇文章时,deleted_comments在评论之前就被销毁了?当注释被销毁时,deleted_comments会被创建而不会被销毁(因为ActiveRecord已经检查了依赖的deleted_comment并试图销毁任何依赖项)?

EN

回答 1

Stack Overflow用户

发布于 2013-12-04 05:27:13

根据official documentation的说法

将多态关联与单表继承(STI)结合使用有点棘手。为了让关联按预期工作,请确保将STI模型的基本模型存储在多态关联的类型列中。为了继续上面的资产示例,假设有来宾帖子和成员帖子使用STI的帖子表。在这种情况下,posts表中必须有一个类型列。

代码语言:javascript
复制
class Asset < ActiveRecord::Base
  belongs_to :attachable, polymorphic: true

  def attachable_type=(sType)
     super(sType.to_s.classify.constantize.base_class.to_s)
  end
end

class Post < ActiveRecord::Base
  # because we store "Post" in attachable_type now dependent: :destroy will work
  has_many :assets, as: :attachable, dependent: :destroy
end

class GuestPost < Post
end

class MemberPost < Post
end

我想您可以使用examle并执行以下操作:

代码语言:javascript
复制
class Article < ActiveRecord::Base
  # for deletion only
  has_many :abstract_comments, :as => :subject, :dependent => :destroy

  # for 'manual' access/edition 
  has_many :comments,         :as => :subject
  has_many :deleted_comments, :as => :subject
end

class AbstractComment < ActiveRecord::Base
  belongs_to :subject, :polymorphic => true

  def attachable_type=(sType)
    super(sType.to_s.classify.constantize.base_class.to_s)
  end
end

class DeletedComment < AbstractComment
end

class Comment < AbstractComment
  before_destroy :create_deleted_comment

  def create_deleted_comment
    DeletedComment.create!(....)
  end
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20361677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档