【问题标题】:ActiveRecord transitive association deletionActiveRecord 传递关联删除
【发布时间】:2013-01-22 05:01:15
【问题描述】:

我有以下型号:

class Organization < ActiveRecord::Base
  has_many :providers, :dependent => :destroy
  has_many :products, :through => :providers
end

class Provider < ActiveRecord::Base
  belongs_to :organization
  has_many :products, :inverse_of => :provider
end

class Product < ActiveRecord::Base
  belongs_to :provider, :inverse_of => :products
end

当我创建一个包含提供者(并且没有产品)的组织,然后使用 destroy 删除它时:

Organization.find(1).destroy

Rails 3.0.x 不会删除关联的提供者,留下不存在的组织 ID。这是一种奇怪的行为,我希望那里要么 nil 要么删除提供者(这就是我想要做的)。

我看到有传递关联 has_many :products :through => :providers - 我想知道这是否是提供者未被删除的原因。

感谢您的帮助

编辑:

好吧这和Rails无关,我们在Provider类里有如下检查

  def prevent_redhat_deletion
    if redhat_provider?
      errors.add(:base, _("Red Hat provider can not be deleted"))
      return false
    end
    true
  end

显然我正在删除一个redhat_provider。出于某种原因,Rails 不会因错误而退出。

【问题讨论】:

  • 你使用的是什么底层数据库?你能发布调用destroy时运行的SQL吗?模型看起来是正确的,这更有可能是数据相关的......
  • PostgreSQL。我只看到这个: AREL (0.2ms) DELETE FROM "organizations" WHERE "organizations"."id" = 4 (并在下一行提交)。组织是通过delayed_jobs 删除的,但这并不重要。删除 SQL 语句很简单。顺便说一句,代码在这里 - github.com/Katello/katello/blob/master/src/app/models/…
  • 顺便说一句,删除 AR 语句是:Organization.unscoped.find(123).destroy,它是在不同的过程中完成的。但是当我从控制台尝试时,我有同样的结果。
  • 我看到的唯一不同寻常的是,您已覆盖 Provider#organization 方法以不返回关联代理。我不确定这是否重要,但您可以在注释掉该代码后重试吗?此外,在 SQL DELETE 语句之前,应该有几个 SELECT 查询运行以收集所有相关关联 - 您是否看到了这一点,特别是对于 providers
  • 将尝试,同时这里是日志:pastie.org/private/hp5m0oqk8w6orpmtznqaq 非常感谢您的帮助。

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord


【解决方案1】:

您还可以尝试将 :dependent = :destroy 更改为 :dependent => :delete。查看提供程序是否被删除。如果他们这样做了,可能是您的代码阻止了删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多