Rails 4.2依赖::解决CollectionProxy的问题

时间:2015-03-01 21:46:46

标签: ruby-on-rails activerecord

我之前在模型上使用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数据库。

1 个答案:

答案 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