【发布时间】: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方法以不返回关联代理。我不确定这是否重要,但您可以在注释掉该代码后重试吗?此外,在 SQLDELETE语句之前,应该有几个SELECT查询运行以收集所有相关关联 - 您是否看到了这一点,特别是对于providers? -
将尝试,同时这里是日志:pastie.org/private/hp5m0oqk8w6orpmtznqaq 非常感谢您的帮助。
标签: ruby-on-rails ruby ruby-on-rails-3 activerecord