Ruby on rails 依赖销毁不销毁依赖项

Ruby on rails 依赖销毁不销毁依赖项,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有以下型号: class Article < ActiveRecord::Base has_many :comments, :as => :subject, :dependent => :destroy has_many :deleted_comments, :as => :subject, :dependent => :destroy end class DeletedComment < ActiveRecord::Base be

我有以下型号:

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
类文章:subject,:dependent=>:destroy
有许多:已删除的注释,:as=>:subject,:dependent=>:destroy
结束
类DeletedCommenttrue
结束
类注释true
销毁前:创建已删除的注释
def create_deleted_注释
DeletedComment.create!(....)
结束
结束
在我的数据库中,我有很多主题为零的DeletedComment对象。DeletedComment(和Comment)模型存储:article\u id,对于主题为nil的模型,article.find(deleted\u Comment.article\u id)会引发ActiveRecord::RecordNotFound错误

是否存在:dependent=>:destroy将销毁父记录但保留依赖项不变的情况

在某些情况下,当我删除一篇文章时,删除的评论是否可能在评论之前被销毁?当注释被销毁时,删除的注释将被创建而不会被销毁(因为ActiveRecord已经检查了相关的已删除注释并试图销毁任何相关内容)?

根据:

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

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
class资产
我想您可以使用examle并执行以下操作:

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
类文章:subject,:dependent=>:destroy
#用于“手动”访问/编辑
有很多:评论,:as=>:主题
已删除多条注释,:as=>:主题
结束
类AbstractCommenttrue
def可连接_类型=(sType)
super(sType.to_s.classification.constantize.base_class.to_s)
结束
结束
类DeletedComment
根据:

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

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
class资产
我想您可以使用examle并执行以下操作:

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
类文章:subject,:dependent=>:destroy
#用于“手动”访问/编辑
有很多:评论,:as=>:主题
已删除多条注释,:as=>:主题
结束
类AbstractCommenttrue
def可连接_类型=(sType)
super(sType.to_s.classification.constantize.base_class.to_s)
结束
结束
类DeletedComment
我可能错了,但我不认为做一个
有太多:as=>X
会导致任何重写。我的注释和删除的注释模型有
subject\u id
subject\u type
,并且
subject\u type
是“Article”,所以对于大多数对象,执行Comment.subject或deleted\u Comment.subject都会返回相应的文章。我倾向于认为
has_many:as=>X
是“将此当前模型视为X”,而不是“此当前模型有一个通过model.X检索X的方法”。您的示例非常有用,似乎是一个很好的方法。但我只是好奇为什么我现有的实现有时能工作,而其他的却不能。我似乎无法在Rails控制台中重现此问题。即使是我在这种情况下的测试用例似乎也没有遇到任何问题。请尝试此页面来配置调试日志记录:当我们看到执行查询中的差异时,我们可能会找到有关原始问题的更多信息。我的猜测是多态关系旨在用于手动操作
*\u type
,默认行为不会删除任何内容以防万一。我可能错了,但我不认为执行
操作会导致任何重写。我的注释和删除的注释模型有
subject\u id
subject\u type
,并且
subject\u type
是“Article”,所以对于大多数对象,执行Comment.subject或deleted\u Comment.subject都会返回相应的文章。我倾向于