我之前在模型上使用dependent: :destroy
没有任何问题,但在rails 4.2中我被卡住了。过去的用途主要是针对经典的has_many belongs_to模型。似乎#<ActiveRecord::Associations::CollectionProxy
似乎导致了我的问题。
class Subject < ActiveRecord::Base
has_many :properties
has_many :values, :through => :properties
has_many :tags, :through => :properties
class Property < ActiveRecord::Base
belongs_to :subject
belongs_to :tag
belongs_to :value
class Value < ActiveRecord::Base
has_one :property
has_one :subject, :through => :property
has_one :tag, :through => :property
class Tag < ActiveRecord::Base
has_many :properties
has_many :subjects, :through => :properties
我的目标是
我尝试在Subject中的值行和Value中的属性行中添加依赖destroy。它会删除属性,但不删除值。我尝试将它放在属性中的值属性行和值行中,并得到相同的结果 - 它不会删除值。
然后,当我尝试模型关联时,我尝试了before_destroy
过滤器并遇到了相同类型的问题或ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR
。然后我将其破解并开始工作:
# In Subject model
before_destroy :destroy_values
def destroy_values
# relations does not seem to work got the Values using a new query
#values.destroy_all
pids = values.pluck(:id)
Value.where(id:pids).destroy_all
end
# in Value model
before_destroy :destroy_property
def destroy_property
property.destroy
end
不确定发生了什么,尽可能多地在dependent
读取并尝试删除__,以及我看到的所有其他事情都没有快乐!
是的,这是一个奇怪的模型,只是玩弄并试图复制“Whatit?”用于笑脸的Apple II数据库。
答案 0 :(得分:0)
有时候,当你被困在圈子里时,你只需要问一个问题。当你没有得到答案时,你有时间重新思考这个问题。我想我没有尝试所有的选择。
我认为问题是我不了解nullify的默认策略。根据我的目标,没有财产就没有价值,反之亦然。尝试使用直通关联破坏会引发pg错误。我显然没有尝试的简单解决方案是依赖于Subject模型中的属性和属性模型中的依赖销毁值。指南中没有对belongs_to
关联使用依赖性破坏的警告可能已经开始了我的圈子之旅。我仍然不确定我理解这个警告。我的猜测是,当subject.properties
被销毁时,在进行property.value
destroy调用之前,subject_id被设置为null,从而避免了pg错误。我清理过的模型:
class Subject < ActiveRecord::Base
has_many :properties, dependent: :destroy
has_many :values, :through => :properties
has_many :tags, :through => :properties
class Property < ActiveRecord::Base
belongs_to :subject
belongs_to :tag
belongs_to :value, dependent: :destroy
class Value < ActiveRecord::Base
has_one :property
has_one :subject, :through => :property
has_one :tag, :through => :property