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都会返回相应的文章。我倾向于