1
class Assembly < ActiveRecord::Base
  has_and_belongs_to_many :parts
end

class Part < ActiveRecord::Base
  has_and_belongs_to_many :assemblies
end

在控制台中:

part1 = Part.new
assembly1 = Assembly.new
assembly1.parts << part1
part1.delete
Parts.all
 => []

检查assembly1.parts表明仍然存在关系。(!)

当记录被删除时,这怎么可能?

此外,如何防止删除与装配相关联的零件?

在 Rails 3.0.7 中工作。

4

3 回答 3

3

您在这里所做的一切都是从内存中完成的(没有任何内容存储在数据库中)。

ActiveRecorddelete方法将从数据库中删除一个对象,但它不会在内存中查找可能已经引用该对象的其他对象。我认为,如果您这样做assembly1.parts.delete(part1),可能会达到您的预期。

如果您已将对象保存到数据库:

part1 = Part.create
assembly1 = Assembly.create(:parts => [part1])
assembly1.parts
# => [part1]
part1.delete
assembly1.parts
# => [part1]
assembly1.reload
assembly1.parts
# => []

请注意,即使它在数据库中part1.delete,也不一定会从您的程序集对象中删除它,直到您刷新内存中的集合或使用我前面提到的方法删除它assembly1.parts.delete(part1)

更新

我认为您通常不应该使用该delete()方法。你应该几乎总是使用destroy(). delete()只会触发对数据库的删除并忽略所有回调,我相信:dependent => :destroy模型中的 -style 声明。如果您使用该destroy()方法,那么您可以在模型中声明一个before_destroy回调:

class MyClass
  has_and_belongs_to_many :foos

  before_destroy :allow_destroy

  def allow_destroy
    foos.empty?
  end
end

如果它是组件的一部分,那应该满足您不破坏它的要求。您无法停止delete()执行,因为它忽略回调: ActiveRecord::Relation#delete 文档

有关模型回调的更多信息(文档)

于 2012-04-10T20:40:26.417 回答
0

您需要添加:dependent => :destroy到控制器。

于 2012-04-10T20:40:13.367 回答
0

您可以通过使用外键添加一些参照完整性来防止myobject.delete在数据库中。我建议查看将外键添加到 Rails 模型

在我的项目中,这并没有阻止myobject.destroy. 我认为这是因为它使用了令人敬畏的嵌套 set gem非常努力地为您处理级联破坏。

为了防止myobject.destroy 我发现如何在 rails supper 中“验证”销毁有帮助

我最终在迁移中使用了before_destroy以及添加了一些参照完整性。如果使用或使用,add_foreign_key这将防止删除。myobject.deletemyobject.destroy

在我的情况下myobject,它本身有很多,并且属于它自己。这就是act_as_nested_set处理。

模型

class Myobject
  before_destroy :allow_destroy
  # ^ this has to be above act_as_nested_set
  acts_as_nested_set

  def allow_destroy
    return true if self.descendants.blank?
    # the error is optional. 
    self.errors.add('Cannot_delete', 'myobject still has children')
    throw(:abort)
  end
end

移民

class AddForignKeyToMyobject < ActiveRecord::Migration
  def change
    add_foreign_key :myobject, :myobject, column: :parent_id
  end
end
于 2019-07-18T05:03:52.220 回答